【问题标题】:PHP Code to stop a script to run from browserPHP代码停止脚本从浏览器运行
【发布时间】:2012-02-12 05:36:51
【问题描述】:

环境:Linux、PHP

场景:我已经编写了一个脚本,它将被设置为一个 cron。现在的情况是我希望脚本仅通过 cron 而不是通过任何浏览器(包括移动浏览器在内的任何 Web 浏览器)运行。所以我正在寻找类似 browserValidate 的功能。

脚本是用MVC框架编写的,运行方式为

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

请帮帮我。

提前致谢。

【问题讨论】:

  • 为什么要使用基于 Web 的 MVC 框架来编写要从 cron 触发的脚本?只需从命令行脚本访问您的模型库。
  • 脚本中有很多函数是在框架中定义的。因此我正在使用 MVC
  • 问题是,如果您不希望从浏览器运行脚本,为什么要首先授予对脚本的 Web 访问权限?
  • @AbhishekSanghvi — 听起来这些函数应该移到共享库中。

标签: php browser cron


【解决方案1】:

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

【讨论】:

  • 嗯,我想知道如何为 OP 的 HTTP 请求设置环境变量 ^^
【解决方案2】:

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

我最喜欢的方法(有很多)是:

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

这意味着如果$isRunningFromBrowser 为真,您只需退出/返回错误消息/无论如何。

【讨论】:

  • OP 编辑​​了问题。该脚本使用类似wget 的二进制文件执行。所以没有argv。此外,作为 FastCGI 运行的 PHP 将在 $_SERVER 中包含 argv
  • @LinusKleen 我从来没有使用过 FCGI 环境,而且它可能会在工作中抛出一个扳手——它是否仍然在全局范围内定义 $argv,或者只是 $_SERVER 中的一个条目?
  • 我的错,@Dave。 $_SERVER仅限。没有可查看的全局变量。
  • 不用担心,您的答案仍然是更相关的解决方案,因为编辑意味着 cron 仍在发出 HTTP 请求。尽管使用 cron/wget 的 OP 方法都是错误的,但远不如仅编写命令行脚本,所以我将把这个答案留在这里,希望有人说服他这样做。不过,你有我的 +1,因为你的解决方案符合他目前的方法。
【解决方案3】:

将脚本移出 web 目录并在命令行上执行。解析脚本的参数以获取适当的 GET 和 POST 变量填充。

http://www.php.net/manual/en/features.commandline.php#94912

【讨论】:

    【解决方案4】:

    我已经编辑了这个以更好地解释:

    由于您使用 /usr/bin/GET 通过 HTTP 获取页面,我假设您有两个独立的服务器: 首先,一个 PHP 脚本在并且你不能运行 cron 脚本的地方。 其次,您在 cron 中运行 /usr/bin/GET fetch 作为一种解决方法。

    一种简单的方法可能是简单地在 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% 安全的,但可以提供帮助。

    【讨论】:

      【解决方案5】:

      一种快速的方法是检查请求 ip 地址并仅在它是本地主机 ip 时运行。

      当然,您需要稍后再添加一些代码(检查用户代理、referer 等),以确保即使是本地浏览器也不会触发脚本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-17
        • 2015-01-28
        • 1970-01-01
        相关资源
        最近更新 更多