allow_url_include控制include/require能否执行远程url文件,开启后导致rfi漏洞;需同时启用allow_url_fopen才生效,dvwa报错是因php默认关闭该高危选项。

allow_url_include 是 PHP 的一个运行时配置项,它控制 include、require、include_once、require_once 这类函数能否直接加载并执行远程 URL(如 http:// 或 ftp://)指向的文件。
它不是“能不能读远程内容”,而是“能不能把远程内容当 PHP 代码执行”——这是关键分水岭。
allow_url_include=On 时会发生什么?
-
include '@#@#@#@#@#@#@#@#@#@0';会被 PHP 解析并执行返回的 PHP 代码 - 这是远程文件包含(RFI)漏洞的直接前提
- 即使
file_get_contents('http://...')能成功(依赖allow_url_fopen),也不代表include能执行它
必须同时满足:
-
allow_url_fopen = On(底层网络访问能力) -
allow_url_include = On(上层解析执行权限)
缺一不可。只开 allow_url_include 而关 allow_url_fopen,include 会直接报错:failed to open stream: no suitable wrapper could be found
为什么 DVWA 报 “allow_url_include is not enabled”?
DVWA 的 File Inclusion 模块故意构造了可被用户控制的 include 调用,比如:
访问全球海洋潮汐模型。功能包括查询指定日期、时间和地点的潮高、潮汐极值及格点天气数据。
$page = $_GET['page']; include $page;
它需要你本地环境支持远程包含,才能演示 RFI 攻击效果。但 PHP 自 4.0.3 起默认设为 Off,所以报错不是 bug,是安全提醒。
常见错误操作包括:
- 只改了
php.ini却没重启 Web 服务(Apache/Nginx + PHP-FPM) - 修改了错误的
php.ini文件(CLI 版本 ≠ Web 版本;PHP 7.4 和 8.1 配置文件路径不同) - 忘记检查
allow_url_fopen是否也为On
file:// 协议不受 allow_url_include 控制
include 'file:///etc/passwd'; 能否成功,和 allow_url_include 完全无关。file:// 是 PHP 内置协议,不走 URL 封装器(wrapper),因此:
- 不受
allow_url_fopen约束 - 不受
allow_url_include约束 - 只受
open_basedir、文件权限、disable_functions等限制
这也是 LFI(本地文件包含)能在生产环境依然存在的根本原因——它不需要开启任何“远程”配置。
allow_url_include 是个高危开关,它的存在意义不是“方便开发”,而是为极少数可信内网场景保留可能性。真实线上环境几乎从不启用,而学习时一旦改完,务必记得改回去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










