Безопасный запуск Cron Jobs с Zend Framework - PullRequest
7 голосов
/ 28 февраля 2011

Я видел много сообщений о 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']?

Что вы все думаете? Предложения? Я работаю один, поэтому у меня нет коллег, чтобы попросить о помощи по этому вопросу ... ТАК мой коллега, в некотором смысле.

Ответы [ 4 ]

8 голосов
/ 28 февраля 2011

Один из способов - установить переменную окружения.

Итак, в вашем crontab

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.

4 голосов
/ 28 февраля 2011

Ну, значение PHPSAPI должно отличаться при запуске через cron и веб-сервер.

3 голосов
/ 01 ноября 2011

Лучший способ защитить вашу работу php cron - это поместить файл php в папку non-public_html.

Например:

Ваша страница находится в /home/myuser/public_html/test.php

Переместите его на /home/myuser/test.php

и введите задание cron:

php -q /home/myuser/test.php

Теперь ни один пользователь не может войти на вашу страницу из браузера, и только задание cron может его использовать.1014 *

1 голос
/ 01 марта 2011

Не каким-то анонимным пользователем и не кем-то, кто должен войти в систему?

Используйте клиентский сертификат x.509.

...