检查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 
+2

好神人,把这个文件全部禁用,或者把它放在公共根目录之上,然后用php调用。 :) – ATechGuy

+0

[只能从Cron运行php脚本或检查cron请求吗?](https://*.com/questions/16702472/run-a-php-script-only-from-cron-or -check-if-request-from-cron) – rickdenhaan

+0

@ATechGuy,不行。必须在abc.tld内。 –

重复How to check if a php script is being called by another script on the server?

答案:

$_SERVER["REMOTE_ADDR"]变量,让你是谁提出的要求应该是客户端的IP地址127.0.0.1当从服务器调用脚本时。

+1

错误。当通过CLI运行php脚本时,不会设置$ _SERVER [“REMOTE_ADDR”]。 – Calimero

+0

哦,是的,我只是在考虑PHP文件仅用于网络使用的可能性,我的不好 –

+0

不要复制/粘贴来自其他问题的答案。如果你发现一个问题可以回答这个问题,那么它应该被标记为重复的(如果你没有代表把它标记为重复的,只是留下一个关于它的评论)。 –

if(php_sapi_name() == 'cli') { 
    // Called from command-line, maybe cron 
} elseif(php_sapi_name() == 'apache2handler') { 
    // Called from the apache2 webserver upon web request 
} 

文档:http://php.net/manual/en/function.php-sapi-name.php

+1

这会做,非常感谢 –

由于从Calimero的回答延长我的研究结论,这里是最可靠的方法,以确保该剧本由crontab中(PHP 5.3+)呼吁:

if(stripos(php_sapi_name(), 'cgi') === false || stripos(php_sapi_name(), 'cli') === false) die('Not cron'); 
+0

你可以偶然发布在你的问题的crontab项?你的回答只有在你运行CGI php作为CLI的时候才有意义(虽然这可能稍微不方便),或者如果cron作业是发送给CGI php的web服务器的curl请求。我很快就抛弃了这些情况,我很乐意根据情况更新我的答案。 – Calimero

+0

刚刚,我的sapi返回cgi_fcgi –

+0

其实实验已经证明你是正确的,@Calimero,Php.net肯定是错的(?)我已经编辑我的答案,通过服务器端结果上的另一个非cron脚本调用脚本在“cgi” –