运行:Linux中,PHPPHP代码停止脚本从Envoirnment浏览器
场景:我写这将被设置为一个cron脚本。现在情况是,我希望脚本只能通过cron运行,而不能通过任何浏览器(包括移动浏览器的任何web浏览器)运行。所以我正在寻找一个类似browserValidate的函数。
剧本是写在MVC框架,将作为运行
/usr/bin/GET http://xyz.com/abc/pqr
请帮助我。
在此先感谢。
运行:Linux中,PHPPHP代码停止脚本从Envoirnment浏览器
场景:我写这将被设置为一个cron脚本。现在情况是,我希望脚本只能通过cron运行,而不能通过任何浏览器(包括移动浏览器的任何web浏览器)运行。所以我正在寻找一个类似browserValidate的函数。
剧本是写在MVC框架,将作为运行
/usr/bin/GET http://xyz.com/abc/pqr
请帮助我。
在此先感谢。
当从crontab的范围内执行脚本,你可以使用$_SERVER
超全局要么检查阿帕奇生成的条目(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
这将设置FOOVAR
只有在客户端的IP地址为“192.168.0.1” 。
嗯,我不知道如何设置环境变量的OP请求OP有问题^^ – hakre 2012-01-17 12:04:35
@hakre请参阅我的编辑。 – 2012-01-17 12:08:31
正如@Mob所说的,实现这一目标的切实方法是将脚本放在无法通过Web服务器访问的地方。如果这是不可能的,或者您不想出于某种原因执行此操作,则需要检测脚本是通过Web服务器还是通过命令行调用。
我给这家最喜欢的方式(有很多)是:
$isRunningFromBrowser = !isset($GLOBALS['argv']);
这意味着,如果$isRunningFromBrowser
是真实的,你只是退出/返回错误消息/不管。
OP编辑了这个问题。该脚本使用'wget'-like二进制文件执行。所以没有'argv'。另外,运行FastCGI的PHP将在'$ _SERVER'中包含'argv'。 – 2012-01-17 12:12:49
@LinusKleen我从来没有FCGI环境,并且可能会在作品中抛出一个扳手 - 它是否仍然在全局范围内定义'$ argv',或者只是在'$ _SERVER'中的一个条目? – DaveRandom 2012-01-17 12:20:05
我的不好,@Dave。 '$ _SERVER' * only *。没有全局可见。 – 2012-01-17 12:28:54
将脚本移到Web目录之外并在命令行上执行它。将参数解析为适当的GET和POST变量填充的脚本。
看到http://www.php.net/manual/en/features.commandline.php#94912
我已经编辑这篇更好地说明:
由于您使用的/ usr/bin中/ GET通过HTTP我假设你有两个单独的服务器抓取网页: 首先,PHP脚本处于打开状态,无法运行cron脚本。 其次,您正在cron中运行/ usr/bin/GET提取作为解决方法。
一个简单的方法可能是简单的URL发布的唯一标识符并检查脚本 这样的:
/usr/bin/GET http://xyz.com/abc/pqr/SomeUniqueIdentifier
另一种方法可以是使用与在/ usr/bin中/ GET -H选项设置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%安全的,但可以提供帮助。
一个快速的方法是检查请求的IP地址,且仅当它是本地主机IP上运行。
当然,你需要在以后添加更多的代码(检查用户代理,引用者等),以确保即使是在本地的浏览器不会触发脚本。
为什么你使用基于web的MVC框架来编写你想从cron触发的脚本?只需从命令行脚本访问您的模型库。 – Quentin 2012-01-17 12:02:41
有很多在框架中定义的脚本中使用的函数。因此,我正在使用MVC – 2012-01-17 12:03:50
问题是,如果您不希望它从浏览器运行,您首先可以通过Web访问脚本? – 2012-01-17 12:06:27