2009-02-17 2 views
2

Я запускаю cronjob, который должен записывать данные в кеш. Я хотел поместить эту cronjob в свою личную папку, однако, даже после того, как CHMODding кэш-папка в частной папке, она не получает права на запись. Кажется, это похоже на функцию plesk.Как вы проверяете, выполняет ли сервер скрипт PHP?

Итак, теперь я разместил cronjob в общей папке. Тем не менее, мне нужно убедиться, что только сценарий может выполнять только сервер. Как насчет следующего в верхней части cronjob?

if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die(); 

Это похоже на работу. Разве это не эксплуатируется, например. может ли пользователь манипулировать его remote_addr на моем сервере? Или есть лучший способ проверить это?

Другой вопрос, у меня есть то, что приведенный выше код возвращает 2 предупреждения, даже если это не похоже на работу:

PHP Notice: Undefined index: SERVER_ADDR in ... on line 2 
PHP Notice: Undefined index: REMOTE_ADDR in ... on line 2 

Любая идея, что является причиной этого?

ответ

5

Выполнение скрипта через консоль, а не веб-сервер.

хрон может выглядеть следующим образом:

*/5 * * * * php -f /path/to/cron.php 

Затем файл может сделать это:

cron.php: 
<?php 

if (array_key_exists('REMOTE_ADDR', $_SERVER)) 
    die("Can only be run from the command line!"); 

Это будет гарантировать, что это работать только на сервере.

Редактировать в ответ на комментарии

Вы не можете попасть в общую папку внутри личной папки, в общем, и если вы не можете добавлять новые каталоги вне веб-корень, кэш реж будет должны быть защищены другим способом.

Я собираюсь предположить, что все ваши файлы находятся в корневом каталоге сети, то есть: /home/site/publichtml. Замените это каким бы то ни было вашим каталогом.

Создать новый каталог /home/site/publichtml/.cache. Добавьте следующее как a.файл .htaccess:

Deny from all 

Теперь ваши сценарии должны быть в состоянии получить доступ к папке в файловой системе, но она недоступна через веб-сервер.

Если вы можете настроить задание cron на сервере (через веб-админу или по-другому, это похоже на то, что вы можете сделать), как описано выше, то есть: используйте команду php -f /home/site/publichtml/cron.php в качестве команды и включите проверку для массива ключ.

В качестве альтернативы, вы можете проверить, как это:

if (!isset($_SERVER['argc'])) 
    die("Must be run from the command line!\n"); 

$_SERVER['argc'] только устанавливается, когда выполняется скрипт из командной строки.

Если вы можете сохранить скрипт cron из корня сети, хорошо. Если нет, это должно быть безопасным.

Наконец, чтобы избавиться от E_NOTICES, добавьте в верхней части cron.php:

error_reporting(E_ALL^E_NOTICE); // Turn off notices 

или

error_reporting(0); // Hide all error reporting 
+0

У меня нет доступа к консоли, к сожалению. Это общий веб-хостинг. – Tom

+0

Если вы можете настроить задания cron (через панель администратора), вы все равно сможете выполнить эту работу, но вы можете потерять часть безопасности (например: нужно переместить реестр кэша в корневой каталог). –

+0

Я попытался создать новую папку перед корнем документа в моем ftp-клиенте, однако я получаю сообщение об отказе в разрешении. – Tom

4

Во-первых, я бы сохранил исполняемый PHP-скрипт в личном каталоге, который может выполняться только привилегированным пользователем, и назначить его в cron для этого пользователя. У вас не должно быть проблем с выполнением скрипта.

Во-вторых, вы можете изменить, где вы записываете данные кэша в общий каталог. Было бы предпочтительнее сохранить это в непубличной директории, но если вы не можете понять, как это сделать в противном случае, и данные в порядке, чтобы быть общедоступными, то, вероятно, все в порядке.

И, наконец, использование $ _SERVER ['SERVER_ADDR'] и $ _SERVER ['REMOTE_ADDR'], вероятно, не лучший способ проверить, работает ли на сервере сценарий. Во-первых, я полагаю, что $ _SERVER ['REMOTE_ADDR'] не будет установлен при запуске PHP-скрипта из командной строки. Это взято из заголовков HTTP, и поскольку их нет, оно будет пустым. Фактически, именно поэтому вы получаете предупреждения - они не установлены. (отредактируйте: глядя на документы PHP, вполне вероятно, что переменная «SERVER_ADDR» не будет установлена ​​для нерабочих сценариев)

+0

Как создать такие каталоги на общем веб-хостинге? – Tom

1

Я думаю, что ответ скрыт в первом ответе джон.

Так что, если вы хотите только этот скрипт доступен через хрон, проверьте наличие сеанса суперглобальных:

if (is_array($_SESSION)) die(); 

И только потому, что это легко, создать .htaccess файл и выполнить команду отрицаю, все.

Я опечатал $ _SESSION как $ _SERVER, мой плохой. Это работает для ваших нужд.

+0

Это неправда. Запустите этот скрипт из командной строки: «print_r ($ _ SERVER);». –

+0

Просто нашел, что один вышел, не работает Encoderer. – Tom

+0

Была опечатка. Исправлено. –

Смежные вопросы