修复不彻底主因是对漏洞本质理解偏差或关键环节妥协:仅过滤关键词、白名单未做硬映射、忽略配置与环境风险、路径规范化未校验根目录。

修复不彻底,往往不是技术没到位,而是对漏洞本质理解有偏差、或在关键环节做了妥协。真正卡住修复效果的,通常就那几个点。
只过滤关键词,不控制路径来源
很多团队看到../被用来穿越目录,就加一条str_replace('../', '', $page),以为万事大吉。但攻击者立刻换用....//、%2e%2e%2f、双写....//、或配合php://filter绕过。关键词过滤是典型的“打补丁式防御”,输入还是动态拼进路径里,只要路径可控,漏洞就还在。
白名单没做映射,只是简单校验后缀
有人写if (substr($page, -4) === '.php') { include($page); },或者用pathinfo检查扩展名。这完全无效——攻击者传config.php%00.jpg就能截断后缀,或者直接包含/var/log/apache2/access.log这种本就不带.php的文件。白名单必须是“固定键 → 绝对路径”的硬映射,比如$map = ['about' => '/app/views/about.php', 'contact' => '/app/views/contact.php'],用户只能选键,不能碰路径。
忽略配置层和运行时环境风险
代码里写了白名单,但php.ini里allow_url_include = On开着,攻击者仍可能通过http://或data://协议远程执行;又或者open_basedir没设,导致白名单之外的敏感路径仍可被读取。还有些项目禁用了include却忘了highlight_file、show_source这些同样能读源码的函数,它们没走包含逻辑,但危害一样。
路径规范化没落地到最终路径
有人做了realpath()或dirname(__FILE__) . '/' . $page,但没验证规范化后的路径是否仍在预期目录下。比如$file = dirname(__FILE__) . '/pages/' . $_GET['p']; $real = realpath($file);,如果$real没和/app/pages/前缀比对,攻击者上传图片马到/tmp/xxx.jpg,再用../../tmp/xxx.jpg照样能绕过。规范化必须配合法定根目录做前缀强校验。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











