PHP代码,用于停止从浏览器运行脚本

时间:2012-01-17 12:00:00

标签: php browser cron

Envoirnment:Linux,PHP

场景:我编写了一个将被设置为cron的脚本。现在的情况是我希望脚本只能通过cron而不是通过任何浏览器(包括移动浏览器的任何网络浏览器)运行。所以我正在寻找像browserValidate这样的函数。

该脚本是用MVC框架编写的,将作为

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

请帮助我。

提前致谢。

5 个答案:

答案 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