Envoirnment:Linux,PHP
场景:我编写了一个将被设置为cron的脚本。现在的情况是我希望脚本只能通过cron而不是通过任何浏览器(包括移动浏览器的任何网络浏览器)运行。所以我正在寻找像browserValidate这样的函数。
该脚本是用MVC框架编写的,将作为
运行/usr/bin/GET http://xyz.com/abc/pqr
请帮助我。
提前致谢。
答案 0 :(得分:8)
正如@Mob所说,实现这一目标的确定方法是将脚本放在无法通过Web服务器访问的位置。如果这是不可能的,或者由于某种原因您不想这样做,则需要检测脚本是通过Web服务器还是通过命令行调用。
我最喜欢的方法(有很多)是:
$isRunningFromBrowser = !isset($GLOBALS['argv']);
这意味着如果$isRunningFromBrowser
为真,您只需退出/返回错误消息/等等。
答案 1 :(得分:6)
从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是服务器,则可以将其添加到.htaccess
文件中:
SetEnvIf Remote_Addr "192.168.0.1" FOOVAR=1
仅当客户端的IP地址为“192.168.0.1”时,才会设置FOOVAR
。
答案 2 :(得分:1)
我编辑了这个以便更好地解释:
由于你使用/ usr / bin / GET通过HTTP获取页面我假设你有两个独立的服务器: 首先,PHP脚本所在的位置以及无法运行cron脚本的位置。 其次,你在cron中运行/ usr / bin / GET fetch作为解决方法。
一种简单的方法可能是在网址中发布唯一标识符并签入脚本 像:
/usr/bin/GET http://xyz.com/abc/pqr/SomeUniqueIdentifier
另一种方法是使用-H选项和/ usr / bin / GET将User-Agent标头设置为唯一的类似:
/ usr / bin / GET -H“User-Agent:SomeUniqueIdentifier”http://xyz.com/abc/pqr
然后,PHP脚本将检查用户代理字符串中是否有这个唯一标识符,如:if (strcmp($_SERVER['HTTP_USER_AGENT'], "SomeUniqueIdentifier") == 0)
{
// do whatever
}
else
{
// do nothing
exit();
}
这两种方式都不是100%安全但可以提供帮助。
答案 3 :(得分:1)
一种快速方法是检查请求IP地址,只有在本地主机IP时才运行。
当然,您需要稍后再添加一些代码(检查用户代理,引用等等),以确保即使是本地浏览器也不会触发脚本。
答案 4 :(得分:0)
将脚本移到Web目录之外并在命令行上执行它。将参数解析为适当的GET和POST变量填充的脚本。
请参阅http://www.php.net/manual/en/features.commandline.php#94912