4

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

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

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

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

有没有办法保护这个脚本?

谢谢彼得

4

5 回答 5

9

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

例子:

DENY FROM ALL
ALLOW FROM 123.123.123.123

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

于 2012-10-29T00:26:41.080 回答
4

这是我的解决方案:

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

cron.php

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

函数.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。如果是开发模式,则跳过限制。您可以将脚本放在任何您想要的地方。

于 2019-01-15T01:59:44.737 回答
3

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

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

于 2012-10-29T00:24:59.353 回答
2

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

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

于 2012-10-29T00:30:01.140 回答
0

如果文件位于不应完全锁定的文件夹中,请将这些行包含在<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>
于 2016-12-30T06:32:34.033 回答