仅从cron作业调用php脚本-拒绝所有其他ip


call php script from cron job only - deny all other ips

有没有办法只从cron作业调用脚本,并使其成为其他ip无法运行该脚本的脚本?

我有一个向手机发送通知的脚本。它应该每天由cron作业调用一次,但有时会有什么触发它,每个人都会在不应该调用的时候得到通知。我想限制它只能从我的服务器调用。

换句话说,使其无法从浏览器或蜘蛛等调用。

感谢

我建议您不要公开此文件。

但要直接回答你的问题;一种方法是添加以下检查:

if (php_sapi_name() === 'cli') {...}

更多信息:https://secure.php.net/manual/en/function.php-sapi-name.php

您的脚本似乎可以通过公共URL获得。把它挪到别的地方去。例如,如果脚本位于/www/site.com/public/script.php内,而/www/site.com/public是Web服务器的公共目录,则将其移动到某个/www/site.com/cron/script.php。请确保Web服务器未配置为从cron目录中提取文件。

正如其他人所写,可能还可以使用其他设置(权限和文件位置)。然而,我从来没有人告诉某人重新设计整个流程以满足单一需求。这感觉太像狗摇尾巴了。因此,如果你希望有一个只能由你的cron作业执行而不能由另一个进程错误执行的脚本,我会为你提供这个解决方案


php_sapi解决方案已经被注意到提供了不一致的行为,并且是特定于系统配置的(例如,在从命令行调用脚本时,以及在从cron调用时,都会回显它的输出)。这可以导致追踪其他错误。我见过并使用过的最好的解决方案是将命令行参数传递给脚本,并评估该参数的存在性。

你的cron工作看起来像:

 * * * * * * php /path/to/script --cron

然后,在脚本中执行if检查,如果不满意,则停止脚本。

if( $argv[0] != 'cron')
{
    //NO CRON ARGUMENT SUPPLIED, SOMETHING ELSE MUST BE CALLING THIS
    exit;
}

请注意,有些系统可能会使用第一个参数作为脚本名称,因此根据您的个人系统配置,您可能需要检查$argv[1]

希望这能有所帮助,如果你有任何问题,请告诉我,如果需要,我很乐意回复或编辑。