我有一个页面,我想通过cron执行。它只是做一些非常简单的归档,没有超高安全性,没有数据库访问等。
为了执行页面,简单地要求存在GET var是一种安全的做法吗?所以myarchiver.php
会是这样的:
<?php
$mysecret_word = "abc123";
if ($_GET['secret'] == $mysecret_word){
// execute my stuff here
}
然后你只需要在crontab中调用myarchiver.php?secret=abc123
并且进程就会运行,而任何错误的答案或尝试执行没有秘密的页面只会呈现一个空白页面(没有额外的服务器负载)。
我意识到这对于中间人攻击中的人并不是“安全的”,如果该网站遭到入侵 - 但我相信一般来说,保持这个脚本不被随机脚本小子和其他可能以某种方式的白痴所解雇是很安全的知道它的存在吗?我正在防范的是随机的恶意用户,他们可能知道这个脚本用请求轰炸它以便使用/占用资源。
编辑添加:服务器无法通过SSH访问,而cron正在远程计算机上执行 - 因此必须通过http请求完成。
感谢您提供意见。
答案 0 :(得分:4)
如果永远不会从浏览器运行此脚本,则应将文件放在Web根目录之外,浏览器无法访问该目录,只需让您的cron在备用位置运行脚本即可。这肯定是最安全的方式。
如果您使用的是共享托管环境,则可能需要浏览器访问才能进行手动运行。我只是使用SSH从其位置手动运行该文件,因为它只需要几秒钟的时间来登录SSH并进入目录。就个人而言,我只是不想在我的网站上留下多余的页面。
答案 1 :(得分:0)
此外,crontab不允许您传递GET变量。你必须这样做 -
/usr/bin/php /home/blah.php hello
然后在脚本中 -
$argv = $_SERVER['argv'];
echo $argv[1];
如果我弄错了,有人会纠正我。
答案 2 :(得分:0)
这是facebook在其logout.php文件中使用的一种技术,因此如果有人发送了一个指向logout.php的链接,它就不会将它们记录下来。我建议这样做。
答案 3 :(得分:0)
$mysecret_word = "abc123";
if ($_GET['asd2edxc32cwqcxad'] === $mysecret_word){
// execute my stuff here
} else {
error_log('oopis');
header('HTTP/1.0 404 Not Found');
die();
}
答案 4 :(得分:0)
首先,为什么不检查发出请求的服务器的IP地址?
如果必须通过HTTP请求完成并且只是检查IP地址不是一个选项,您可以让您的cron运行类似于“runcron.php”的脚本。该脚本反过来会向您要运行的实际cron脚本发出CURL或WGET请求。
这将允许您传递动态哈希而不是静态密钥。如果他们碰巧嗅到流量,这将阻止某人重复HTTP请求。对于散列,你可以使用任何动态的东西,比如日期和盐的结合。
示例:
if (md5('secretword') . date('H')) == $_GET['hash']) { // do cron }
这至少会每小时旋转一次你的密钥。