PHP-код, чтобы остановить скрипт для запуска из браузера - PullRequest
5 голосов
/ 17 января 2012

Окружение: Linux, PHP

Сценарий: я написал скрипт, который будет установлен как cron. Теперь дело в том, что я хочу, чтобы скрипт запускался только через cron, а не через какой-либо браузер (любой веб-браузер, включая мобильные браузеры). Поэтому я ищу функцию, похожую на browserValidate.

Сценарий написан в среде MVC и будет запускаться как

/usr/bin/GET http://xyz.com/abc/pqr

Пожалуйста, помогите мне с этим.

Спасибо заранее.

Ответы [ 5 ]

8 голосов
/ 17 января 2012

Как сказал @Mob, верный способ добиться этого - поместить скрипт в такое место, где к нему нельзя получить доступ через веб-сервер.Если это невозможно или вы не хотите делать это по какой-либо причине, вам необходимо определить, был ли скрипт вызван через веб-сервер или через командную строку.

Мой любимый подход для этого (тамis many) is:

$isRunningFromBrowser = !isset($GLOBALS['argv']);

Это означает, что если $isRunningFromBrowser равно true, вы просто выходите / возвращаете сообщение об ошибке / что угодно.

6 голосов
/ 17 января 2012

При выполнении скрипта из crontab, вы можете использовать суперглобальный $_SERVER для проверки сгенерированных Apache записей (HTTP_*) или - поскольку $_SERVER отражает среду исполняемого двоичного файла - определить определенную переменную среды до выполнение:

# in the crontab
FOOVAR=1 /usr/bin/php5 script.php

Затем в файле script.php проверьте наличие FOOVAR:

if (!isset($_SERVER['FOOVAR']))
   die('No browser access.');

Если ваш cronjob выполняется с wget, а IP-адрес клиента совпадает с IP-адресом сервера, вы можете добавить его в файл .htaccess:

SetEnvIf Remote_Addr "192.168.0.1" FOOVAR=1

Это установит FOOVAR, только если IP-адрес клиента равен «192.168.0.1».

1 голос
/ 17 января 2012

Одним из быстрых способов является проверка IP-адреса запроса и запуск только в том случае, если это IP-адрес локального хоста.

Конечно, вам нужно добавить еще немного кода позже (проверьте пользовательский агент, реферер и т. Д.).), чтобы убедиться, что даже браузер локально не запускает скрипт.

1 голос
/ 17 января 2012

Я отредактировал это, чтобы объяснить лучше:

Поскольку вы используете / usr / bin / GET для извлечения страницы через HTTP, я предполагаю, что у вас есть два отдельных сервера: Во-первых, тот, на котором включен PHP-скрипт, и где вы не можете запускать cron-скрипты. Во-вторых, тот, где вы запускаете / usr / bin / GET fetch в cron в качестве обходного пути для этого.

Простой способ может заключаться в том, чтобы просто опубликовать уникальный идентификатор в URL и проверить в скрипте как:

/usr/bin/GET http://xyz.com/abc/pqr/SomeUniqueIdentifier

Другим способом может быть использование опции -H с / usr / bin / GET, чтобы установить для заголовка User-Agent что-то уникальное, например:

/ usr / bin / GET -H "Пользователь-агент: SomeUniqueIdentifier" http://xyz.com/abc/pqr

Затем скрипт PHP проверит строку агента пользователя на наличие этого уникального идентификатора, например:

if (strcmp($_SERVER['HTTP_USER_AGENT'], "SomeUniqueIdentifier") == 0)
{
   // do whatever
}
else
{
   // do nothing
   exit();
}

Ни один из способов не является на 100% безопасным, но может помочь.

0 голосов
/ 17 января 2012

Переместите скрипт за пределы веб-каталога и выполните его в командной строке.Разобрать аргументы сценария для соответствующей совокупности переменных GET и POST.

см. http://www.php.net/manual/en/features.commandline.php#94912

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...