我目前正在从事一个涉及使用 CRON 作业的新项目。
CRON 脚本基本上运行 SQL 查询,将数据生成到文件中,然后通过 FTP 将该文件发送到另一台服务器。
该脚本位于实时网站 (www.website.com/sendOrders.php)
我没有看到任何安全问题或威胁,而且我认为任何人都不太可能在服务器上找到 PHP 脚本。但是我不希望脚本被任何外人执行。
有没有办法保护这个脚本?
谢谢彼得
我目前正在从事一个涉及使用 CRON 作业的新项目。
CRON 脚本基本上运行 SQL 查询,将数据生成到文件中,然后通过 FTP 将该文件发送到另一台服务器。
该脚本位于实时网站 (www.website.com/sendOrders.php)
我没有看到任何安全问题或威胁,而且我认为任何人都不太可能在服务器上找到 PHP 脚本。但是我不希望脚本被任何外人执行。
有没有办法保护这个脚本?
谢谢彼得
您可以将“秘密文件”移动到子文件夹中,然后在其中创建一个.htaccess 文件,以防止所有人访问该文件,运行 Cronjob 的服务器除外。
例子:
DENY FROM ALL
ALLOW FROM 123.123.123.123
如果您有 shell 访问权限,您也可以将脚本放在可访问文件夹之外,并通过命令行或 cronjob 直接运行,如下所示php script.php
:
这是我的解决方案:
检查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。如果是开发模式,则跳过限制。您可以将脚本放在任何您想要的地方。
为什么不直接将脚本移到服务器的 Web 根目录之外并从 CLI 执行呢?这是没有其他人执行它的机会。
如果您必须将它放在 webroot 中(并且应该没有理由),只需确保请求的客户端是您正在运行它的服务器,它应该绰绰有余。
这似乎相当愚蠢。当您可以简单地让机器 B 的本机调度系统(无论它碰巧是什么操作系统)自己完成工作时,为什么要让 cron onmachine A
通过 HTTP on 调用脚本?machine B
然后,您可以将脚本隐藏在无法通过 HTTP 访问的某个地方,并使您的安全问题完全没有实际意义。
如果文件位于不应完全锁定的文件夹中,请将这些行包含在<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>