应禁用allow_url_fopen和allow_url_include、使用白名单校验远程地址、映射用户输入到本地路径、启用Suhosin拦截危险协议、结合realpath与DOCUMENT_ROOT校验路径。

如果您在PHP应用中使用include、require等函数动态加载外部文件,而用户可控参数被直接拼接进文件路径,则可能触发远程文件包含(RFI)漏洞。以下是防止该漏洞的多种方法:
一、禁用远程文件包含功能
PHP默认允许通过allow_url_fopen和allow_url_include两个配置项启用远程URL读取与包含能力。关闭这两项可从根本上阻断RFI攻击路径。
1、打开php.ini配置文件。
2、将allow_url_fopen设置为Off。
3、将allow_url_include设置为Off。
4、重启Web服务器使配置生效。
此操作将禁止所有通过HTTP/FTP协议加载远程资源的行为,是防御RFI最基础且有效的措施。
二、使用白名单校验远程源地址
若业务确需支持有限范围内的远程包含(如内部微服务间调用),应严格限定可访问的主机域名或IP段,拒绝一切未授权远程目标。
1、定义可信远程主机列表,例如$trusted_hosts = ['api.internal.example.com', '10.0.1.5'];。
2、从用户输入中提取待包含的URL。
3、使用parse_url()解析URL并获取host字段。
4、检查解析出的host是否存在于$trusted_hosts数组中。
5、仅当匹配成功时才执行file_get_contents()或include操作。
任何未显式列入白名单的域名或IP均视为不可信,必须拒绝处理。
三、强制使用本地文件路径映射
避免直接接受并拼接用户提供的URL字符串,改为将用户输入映射为预定义的本地文件路径,彻底剥离网络协议参与环节。
1、建立远程资源标识符到本地缓存路径的映射表,例如$map = ['report_v1' => '/var/cache/reports/v1.php'];。
2、接收用户提交的标识符(如$_GET['src'])。
3、验证该标识符是否为映射表中的合法键名。
4、若存在对应键,则加载其映射的本地绝对路径文件。
该方式完全规避了URL解析逻辑,杜绝了协议头注入与DNS重绑定等绕过手段。
四、启用Suhosin扩展进行协议拦截
Suhosin是一个PHP安全补丁扩展,可在运行时检测并阻止含危险协议(如http://、ftp://)的文件包含请求,作为php.ini配置之外的纵深防御层。
1、确认服务器已安装Suhosin扩展并启用。
2、在php.ini中设置suhosin.executor.include.allowed_phar = 0。
3、设置suhosin.executor.include.blacklist = "http://,https://,ftp://,php://"。
4、重启PHP服务使规则生效。
Suhosin会在函数调用前拦截非法协议,即使代码中存在漏洞也难以触发RFI。
五、结合realpath与DOCUMENT_ROOT做路径归一化校验
虽然主要用于防御LFI,但在混合型攻击场景下(如RFI配合SSRF回连内网),对远程URL解析后的本地缓存路径执行归一化校验可增强鲁棒性。
1、将远程URL下载至临时目录,生成本地路径$local_path = sys_get_temp_dir() . '/' . uniqid() . '.php';。
2、使用file_put_contents($local_path, $content);写入内容。
3、调用realpath($local_path)获取规范绝对路径。
4、比对realpath($_SERVER['DOCUMENT_ROOT'])是否为该路径的父目录。
5、仅当$local_path位于Web根目录下且无符号链接逃逸时才允许包含。
该步骤可识别并拒绝由恶意URL诱导生成的跨目录或符号链接指向的非法文件路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











