【发布时间】:2020-05-08 14:31:00
【问题描述】:
我的服务器上有一些 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;
}
所以现在我有以下问题:
- 这有多安全?
- 有什么风险?
- 我怎样才能使它更安全?
- 还有其他(更好的)解决方案吗?
附言。我之前的问题已关闭,因为有人认为这个问题与PHP IP Address Whitelist with Wildcards 重复。但我不是这样的!这个问题是关于在白名单中使用通配符,而这个问题是关于此解决方案的安全性和风险。
【问题讨论】:
-
你为什么要把php文件放在公共空间? cron 制作的文件更是如此。在服务器崩溃的情况下,它们可以显示为 txt。如果 IP 是共享的,您的安全性就会很弱。
-
这两个问题都与服务器类型无关。 PHP 用作预处理器,这意味着如果 www 服务器网关不起作用,则 php 页面以 mime-type html/txt 发送。 (例如,您丢失了 MySQL 密码)。在 public_html 中应该只有一个指向应用程序主文件的符号链接,或者如果您不能放置符号链接脚本,其中包含来自 public_html 外部的应用程序文件和静态文件。然后,如果发生故障,则不会披露或披露不相关的信息。
-
是的。 Cron 脚本运行 php-cli,因此它们没有理由拥有公共访问权限。所有活动文件都应该在公共目录之外。尤其是带有密码等的 .inc 文件。
-
既然脚本不能通过www访问,为什么还要检查其中的IP地址呢?在不了解所有细节的情况下很难谈论应用程序设计。我宁愿使用 iptables 或 htaccess 或 htpasswd 来管理对敏感数据的访问。
-
谢谢。我写了答案。