禁用allow_url_include和allow_url_fopen、启用open_basedir限制、采用白名单校验文件路径、替换动态包含为静态路由分发是防范php远程文件包含漏洞的四大核心防护措施。

当PHP应用程序使用include()等函数动态包含远程文件时,若服务器配置不当,攻击者可强制加载并执行外部恶意脚本。以下是针对该风险的多种防护手段:
一、禁用allow_url_include与allow_url_fopen
这两个PHP配置项是远程文件包含(RFI)的前提条件,关闭后可从根本上阻断HTTP/FTP协议类远程包含行为。
1、编辑php.ini配置文件,定位到allow_url_include参数行。
2、将allow_url_include = On修改为allow_url_include = Off。
3、同样查找allow_url_fopen参数,将其设为allow_url_fopen = Off。
4、保存文件后重启Web服务器(如Apache或Nginx)使配置生效。
二、启用open_basedir路径限制
open_basedir强制PHP脚本只能访问指定目录及其子目录内的文件,有效防止目录遍历与敏感文件读取。
1、在php.ini中添加或修改open_basedir指令,例如:open_basedir = /var/www/html/:/tmp/。
2、确保路径末尾包含斜杠“/”,否则会被识别为前缀匹配而非精确目录。
3、若使用虚拟主机,可在.htaccess中通过php_admin_value设置:php_admin_value open_basedir "/var/www/site1/:/tmp/"。
4、验证配置是否生效:创建测试脚本调用ini_get('open_basedir'),输出应为设定值。
三、采用白名单机制校验文件路径
不依赖黑名单过滤,而是仅允许预定义的合法文件名参与include操作,彻底规避路径操控风险。
1、将所有可被用户选择的页面文件名硬编码为数组,例如:$valid_pages = ['home.php', 'about.php', 'contact.php'];。
2、接收用户输入后,使用in_array()严格比对$_GET['page']是否存在于该数组中。
3、若匹配失败,直接返回HTTP 403或终止脚本,禁止执行include语句。
4、所有合法页面文件应存放于独立子目录(如/pages/),且该目录不对外提供直接HTTP访问权限。
四、替换动态包含为静态路由分发
消除include()函数对用户输入的直接依赖,改由程序逻辑控制资源加载路径,从架构层面规避风险。
1、定义统一入口文件(如index.php),所有请求均经由此文件路由。
2、根据URL参数或PATH_INFO解析出业务模块标识,例如解析/path/user/profile为module=user&action=profile。
3、使用switch-case或映射表将模块标识对应到预置的控制器类或模板路径,例如:'user' => '/app/controllers/UserController.php'。
4、仅加载映射表中明确声明的文件路径,完全忽略原始用户传入的任意字符串参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











