Я видел много сообщений о cron и ZF, но большинство решений оставляют работу доступной для запуска публикой.
Что делать, если вы хотите настроить действие, которое может ТОЛЬКО запускаться cron? Не каким-то анонимным пользователем, а не кем-то, кто должен войти в систему?
Решение, которое я использую, связано с помещением файла за пределы моего веб-корня, поскольку он достаточно загружает ZF, чтобы использовать то, что мне нужно (например, мне не нужно представление), а затем удалять его из cron. Мои вопросы: это способ «наилучшей практики»? Что делать, если вам нужно сделать код доступным через Интернет, но все же необходимо предотвратить случайное использование пользователями пользователей?
Для иллюстрации, вот что я делаю (что работает) для выполнения задания cron из командной строки php и на том же сервере, что-то вроде этого:
* 10 * * * php /Apps/ZF/cronjobs/crontest.php
Webroot: /Apps/ZF/someproject/
crontest.php:
<?php ini_set('include_path', ini_get('include_path') . ':/Apps/ZF/someproject/library'); define('APPLICATION_PATH','/Apps/ZF/someproject/application'); define('APPLICATION_ENVIRONMENT','test'); //Include the loader (for loading ZF resources) require_once 'Zend/Loader.php'; //Include the model (to access the Sites model in this case) require_once(APPLICATION_PATH . '/models/Planets.php'); Zend_Loader::registerAutoload(); $configuration = new Zend_Config_Ini( APPLICATION_PATH . '/config/config.ini', APPLICATION_ENVIRONMENT ); // DB adapter $dbAdapter = Zend_Db::factory($configuration->database); // DB table setup Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); // Whatever code we want to run... $test = new Model_Planets(); $test->fetchEntries(); Zend_Debug::dump($test); ?>
Итак, как я уже сказал, это работает, поэтому я не ищу, чтобы кто-то написал мне решение … просто любопытно сделать это «лучше». Кроме того, что, если бы мне было нужно, чтобы это было доступно через Интернет, но все же хотите, чтобы он был доступен только cron? Как сделать его более гибким (потому что здесь я жестко кодирую несколько путей, которые, как я подозреваю, можно сделать более динамичными)?
Я предполагаю, что могу составить список разрешенных серверов, а затем проверить это с помощью $_SERVER['REMOTE_ADDR']
?
Что вы все думаете? Предложения? Я работаю один, поэтому у меня нет коллеги, чтобы попросить о помощи в этом … Так что это мой коллега.
Один из способов – установить переменную окружения.
Итак, в вашем кронтабе
SCRIPT_RUN_ENV=cron * * * * * foo.php // Whatever your line is
Затем в приложении просто проверьте, что:
if (get_env('SCRIPT_RUN_ENV') != 'cron') { echo "Program cannot be run manually\n"; exit(1); }
Теперь любой может установить свою переменную окружения на это значение и успешно запустить cron, но он должен остановить тривиальное выполнение (или случайное) …
Но также обратите внимание, что любой, кто может редактировать переменную окружения на сервере, уже может выполнить ее, поэтому нет реального способа защитить ее с этого угла (ни один из них не автоматизирован как минимум). Также стоит отметить, что вы не можете вводить переменная среды через HTTP.
Ну, значение PHPSAPI должно отличаться, когда оно выполняется через cron и web-сервер.
Лучший способ защитить ваше задание php cron – поместить файл php в папку non-public_html.
Например:
Ваша страница находится в /home/myuser/public_html/test.php
Переместите его в /home/myuser/test.php
и положить в работу cron:
php -q /home/myuser/test.php
Теперь ни один пользователь не может ввести вашу страницу из браузера, и только работа cron может ее использовать.
Не каким-то анонимным пользователем, а не кем-то, кто должен войти в систему?
Используйте сертификат клиента x.509.