我的服务器上有一些PHP脚本,可用于定期执行cron作业(例如,用于日常融洽和更新排行榜)。
为了防止局外人手动运行这些脚本(http://url/script.php
例如,通过在浏览器中运行),我包含了以下代码,以在运行实际脚本之前检查IP地址。其中XX.XX.XX.XX代表我自己网络的IP地址。
$remote = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : '127.0.0.1';
$whitelist = array('XX.XX.XX.XX', '127.0.0.1');
if (!in_array($remote, $whitelist))
{
exit;
}
所以现在我有以下问题:
PS。我之前的问题已关闭,因为有人认为此问题与带有通配符的PHP IP地址白名单相同。但是我不是这样!该问题涉及在白名单中使用通配符,而此问题涉及此解决方案的安全性和风险。
提出的方法并不完全安全。
PHP充当文本预处理器,这意味着在Web服务器网关错误的情况下,脚本内容可以使用mime类型的text / html发送,这可能会泄露敏感数据,例如SQL数据库的密码或(s)ftp帐户。
如果脚本中控制的IP地址是共享(或动态传输)的地址,则公开放置的管理脚本还可能面临未经授权执行的风险。Cron脚本使用php-cli执行,因此不需要任何Web服务器网关,并且如果脚本不在公共目录中,则无需在脚本中进行IP分析。
使用例如curl的远程执行可能是将管理脚本放置在www服务器的公共空间中的唯一原因。这通常是一个较弱的解决方案,因为此脚本随后会使用其他设置执行php解释器(而不是php-cli),通常会大大限制执行时间。但是,如果出于某种原因,它应该位于一个单独的目录中,该目录只能使用.htaccess(和/或.iptables)访问特定的IP地址,并使用htpasswd(基本身份验证)分配给用户名和密码。
理想的情况是www服务器的公共目录(以下称为public)仅包含静态内容(img,css,js ...文件),并且应用程序触发器位于父目录中。示例结构为:
/home/username/domainname/(apps,crons,public,tmp)
apps目录应包含所有应用程序文件和目录。公共目录应仅包含静态内容(用于某些子目录中的顺序)和指向应用程序主文件的符号链接,可以通过以下命令获得该链接:
ln -s ../apps/app.php index.php
某些服务器配置不允许使用符号链接。然后,您可以使用包含以下内容的index.php文件:
<?php
include('/home/username/domainname/apps/app.php');
由于网关发生故障,因此会显示目录结构,因此该解决方案会更糟。但是,敏感数据仍然是安全的,因为Web服务器无法显示不存在的文件的内容。
假设php文件本身在公共Web服务器外部,则所提供的IP分析可用于显示授权地址的部分内容。但是,如果这些网站是整个网站,我希望使用iptables或.htaccess来管理对它们的访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句