PHP 7.3 POST型文件包含漏洞本质与GET型相同,即用户通过$_POST控制include路径导致敏感文件读取或代码执行;防御核心是切断“输入→拼接→执行”链,须采用白名单映射、禁用危险协议(allow_url_include=Off)、设置open_basedir限制文件操作范围。

PHP 7.3 中的 POST 型文件包含漏洞,本质和 GET 型一样:攻击者通过 $_POST 参数控制 include、require 等函数的路径参数,从而读取敏感文件或执行恶意代码。防御关键不是“堵 POST”,而是切断“用户输入 → 文件路径拼接 → 解析执行”这条链。下面从三个实操层面讲清楚怎么做。
严格校验并限制可包含的文件范围
永远不要拼接用户输入进 include()。正确做法是用白名单映射,把业务允许的页面名硬编码为键值对:
- 比如支持
page=home、page=about、page=contact,就定义数组:$pages = ['home' => 'home.php', 'about' => 'about.php', 'contact' => 'contact.php']; - 再用
if (isset($pages[$_POST['page']])) { include $pages[$_POST['page']]; },其他值直接拒绝 - 避免用
in_array()或正则模糊匹配,防止绕过;键必须完全匹配,且只允许小写字母+下划线
禁用危险协议与外部加载能力
PHP 7.3 默认仍启用 php://input、data://、phar:// 等协议,它们是 POST 型 RCE 的主力通道。在 php.ini 中关闭:
-
allow_url_include = Off(必须关,否则include $_POST['x']可远程加载 -
allow_url_fopen = Off(辅助限制,减少伪协议利用面 -
disable_functions = phpinfo,system,exec,passthru,shell_exec,proc_open(配合白名单,降低执行风险
使用 open_basedir 锁定文件操作边界
即使路径被绕过,也能阻止读取系统关键目录:
立即学习“PHP免费学习笔记(深入)”;
- 在
php.ini或虚拟主机配置中设置:open_basedir = /var/www/html/:/tmp/ - 确保路径以
/结尾,多个路径用冒号分隔(Linux)或分号(Windows) - 注意:该配置对
include有效,但对file_get_contents等函数也起作用,需同步检查业务是否依赖跨目录读取
不复杂但容易忽略的是:POST 参数同样可被 URL 编码、双写、大小写混用等方式绕过简单过滤。所以别信“我只过滤了 ../ 就安全了”。真正有效的防御,是让路径根本不可控,而不是指望拦住所有变形输入。



















