【问题标题】:Can I protect my CRON scripts from remote users?我可以保护我的 CRON 脚本免受远程用户的攻击吗?
【发布时间】:2012-10-18 08:16:24
【问题描述】:

我目前正在从事一个涉及使用 CRON 作业的新项目。

CRON 脚本基本上运行 SQL 查询,将数据生成到文件中,然后通过 FTP 将该文件发送到另一台服务器。

脚本位于实时网站 (www.website.com/sendOrders.php)

我没有发现任何安全问题或威胁,而且我认为任何人都不太可能在服务器上找到 PHP 脚本。但是我不希望脚本被任何外人执行。

有什么方法可以保护这个脚本吗?

谢谢 彼得

【问题讨论】:

  • 最简单的方法是定义一个秘密令牌,并从 cron 作业中传递它。 PHP文件可以猜也可以爬,token不行。
  • 令牌是否有可能被泄露,我将如何传递令牌?发布或获取。我从未使用过 CRON,所以我不确定他们是否使用 POST/GET?
  • 如果是实际的 cron 脚本,请将其放在 webroot 之外。如果是 webcron,放入一个目录,让 Apache 处理 HTTP 授权。
  • 你怎么称呼它?通过卷曲?或者你只是在做类似 php /path/to/sendOrders.php 的事情?如果你不能将它移出到 web 根目录,你可以使用 apache acls 来拒绝它被调用 别管令牌。

标签: php permissions cron file-permissions user-permissions


【解决方案1】:

您可以将“秘密文件”移动到子文件夹中,然后在其中创建一个.htaccess file,以防止所有人访问该文件,运行 Cronjob 的服务器除外。

例子:

DENY FROM ALL
ALLOW FROM 123.123.123.123

如果您有 shell 访问权限,您也可以将脚本放在可访问文件夹之外,并通过命令行或 cronjob 直接运行,如下所示:php script.php

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    cron.php 中检查是否发送了某些特定的标头

    cron.php

    if (secure_cron_script() === false) {
        echo 'Unauthorized';
        return;
    }
    echo 'OK';
    

    functions.php

    function secure_cron_script () {
        if (DEBUG)
            return true;
    
        $http_headers = getallheaders();
        if (empty($http_headers['X-My-Cron-token'])
        || $http_headers['X-My-Cron-token'] !== SECURE_CRON_TOKEN) {
            return false;
        }
        return true;
    }
    

    如何使用 curl 调用 cron:

    curl --header "X-My-Cron-token: 321123321sd"  https://example.com/cron.php
    

    没有 IP 限制。没有 GET/POST。如果是开发模式,则跳过限制。你可以把脚本放在任何你想要的地方。

    【讨论】:

      【解决方案3】:

      为什么不直接将脚本移到服务器的 Web 根目录之外并从 CLI 执行呢?这是没有其他人执行它的机会。

      如果您必须在 webroot 中拥有它(并且应该没有理由),只需确保请求的客户端是您正在运行它的服务器,它应该绰绰有余。

      【讨论】:

        【解决方案4】:

        这似乎很愚蠢。为什么machine A 上的cron 通过machine B 上的HTTP 调用脚本,而您可以简单地让机器B 的本机调度系统(无论它碰巧是什么操作系统)自己完成这项工作?

        然后您可以将脚本隐藏在无法通过 HTTP 访问的某个地方,从而使您的安全问题完全没有实际意义。

        【讨论】:

        • 脚本运行的框架与网站其余部分使用的框架相同。如果我把它移到别处它就行不通了..但我知道你来自哪里。
        • 大多数不错的框架都允许您在 Web 根目录之外运行其中的一部分。
        【解决方案5】:

        如果文件位于不应完全锁定的文件夹中,请将这些行包含在<Files whatever.php>...</Files>

        <Files "cron.php">
          Order deny,allow
          Allow from name.of.this.machine
          Allow from another.authorized.name.net
          Allow from 127.0.0.1
          Deny from all
        </Files>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-22
          • 1970-01-01
          • 2015-12-22
          • 1970-01-01
          • 2011-01-31
          • 1970-01-01
          • 2011-03-16
          相关资源
          最近更新 更多