2012-01-17 44 views
5

运行:Linux中,PHPPHP代码停止脚本从Envoirnment浏览器

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

剧本是写在MVC框架,将作为运行

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

请帮助我。

在此先感谢。

+1

为什么你使用基于web的MVC框架来编写你想从cron触发的脚本?只需从命令行脚本访问您的模型库。 – Quentin 2012-01-17 12:02:41

+0

有很多在框架中定义的脚本中使用的函数。因此,我正在使用MVC – 2012-01-17 12:03:50

+0

问题是,如果您不希望它从浏览器运行,您首先可以通过Web访问脚本? – 2012-01-17 12:06:27

回答

6

当从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” 。

+0

嗯,我不知道如何设置环境变量的OP请求OP有问题^^ – hakre 2012-01-17 12:04:35

+0

@hakre请参阅我的编辑。 – 2012-01-17 12:08:31

8

正如@Mob所说的,实现这一目标的切实方法是将脚本放在无法通过Web服务器访问的地方。如果这是不可能的,或者您不想出于某种原因执行此操作,则需要检测脚本是通过Web服务器还是通过命令行调用。

我给这家最喜欢的方式(有很多)是:

$isRunningFromBrowser = !isset($GLOBALS['argv']); 

这意味着,如果$isRunningFromBrowser是真实的,你只是退出/返回错误消息/不管。

+0

OP编辑了这个问题。该脚本使用'wget'-like二进制文件执行。所以没有'argv'。另外,运行FastCGI的PHP将在'$ _SERVER'中包含'argv'。 – 2012-01-17 12:12:49

+0

@LinusKleen我从来没有FCGI环境,并且可能会在作品中抛出一个扳手 - 它是否仍然在全局范围内定义'$ argv',或者只是在'$ _SERVER'中的一个条目? – DaveRandom 2012-01-17 12:20:05

+0

我的不好,@Dave。 '$ _SERVER' * only *。没有全局可见。 – 2012-01-17 12:28:54

1

我已经编辑这篇更好地说明:

由于您使用的/ 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%安全的,但可以提供帮助。

1

一个快速的方法是检查请求的IP地址,且仅当它是本地主机IP上运行。

当然,你需要在以后添加更多的代码(检查用户代理,引用者等),以确保即使是在本地的浏览器不会触发脚本。