检查php脚本是由服务器调用还是在php中远程调用?
我有一个crontab php脚本驻留在abc.tld文件夹之一。 问题是,剧本也可以通过直接调用它被解雇(即http://abc.tld/crontab.php) 为了消除这种可能性,我认为,我可以做类似检查php脚本是由服务器调用还是在php中远程调用?
if(isset($_SERVER['REQUEST_METHOD']) || isset($_SERVER['REMOTE_ADDR']))
die('Never gonna happen!');
但是,什么是正确的方式? (除的.htaccess)
crontab条目:
0 12 * * 1 /usr/local/bin/php /home/pavellebedev/public_html/abc.tld/wp-content/plugins/easy-timesheet/kernel/cron/ezts_timesheet_notifications.php
重复How to check if a php script is being called by another script on the server?
答案:
的$_SERVER["REMOTE_ADDR"]
变量,让你是谁提出的要求应该是客户端的IP地址127.0.0.1
当从服务器调用脚本时。
错误。当通过CLI运行php脚本时,不会设置$ _SERVER [“REMOTE_ADDR”]。 – Calimero
哦,是的,我只是在考虑PHP文件仅用于网络使用的可能性,我的不好 –
不要复制/粘贴来自其他问题的答案。如果你发现一个问题可以回答这个问题,那么它应该被标记为重复的(如果你没有代表把它标记为重复的,只是留下一个关于它的评论)。 –
if(php_sapi_name() == 'cli') {
// Called from command-line, maybe cron
} elseif(php_sapi_name() == 'apache2handler') {
// Called from the apache2 webserver upon web request
}
这会做,非常感谢 –
由于从Calimero的回答延长我的研究结论,这里是最可靠的方法,以确保该剧本由crontab中(PHP 5.3+)呼吁:
if(stripos(php_sapi_name(), 'cgi') === false || stripos(php_sapi_name(), 'cli') === false) die('Not cron');
你可以偶然发布在你的问题的crontab项?你的回答只有在你运行CGI php作为CLI的时候才有意义(虽然这可能稍微不方便),或者如果cron作业是发送给CGI php的web服务器的curl请求。我很快就抛弃了这些情况,我很乐意根据情况更新我的答案。 – Calimero
刚刚,我的sapi返回cgi_fcgi –
其实实验已经证明你是正确的,@Calimero,Php.net肯定是错的(?)我已经编辑我的答案,通过服务器端结果上的另一个非cron脚本调用脚本在“cgi” –
好神人,把这个文件全部禁用,或者把它放在公共根目录之上,然后用php调用。 :) – ATechGuy
[只能从Cron运行php脚本或检查cron请求吗?](https://stackoverflow.com/questions/16702472/run-a-php-script-only-from-cron-or -check-if-request-from-cron) – rickdenhaan
@ATechGuy,不行。必须在abc.tld内。 –