修复存在LFI漏洞的Ship Parts网站:验证合法文件访问
修复Ship Parts网站LFI漏洞的极简方案
核心思路
别慌!咱们不用搞复杂的路径校验,直接搞个**「合法文件白名单」**——只允许访问你提前指定的文件,任何不在名单里的请求直接返回错误提示。不管黑客怎么篡改参数,都钻不了空子。
具体修复步骤(以最常见的PHP为例,其他语言逻辑通用)
假设你现在的漏洞代码大概是这样的(直接包含用户提交的文件):
$file = $_GET['page']; // 获取用户传的文件名参数 include($file); // 直接包含文件——这就是漏洞根源!
把上面的代码完全替换成下面这段,我标了超直白的注释,照着抄就行:
// 第一步:把所有允许访问的合法文件名列在这里 $allowed_files = [ 'inflatable.html', 'engine-parts.html', 'hull-accessories.html' // 最后一个文件名后面不用加逗号 ]; // 第二步:拿到用户请求的文件名 $requested_file = $_GET['page']; // 第三步:检查请求的文件是否在白名单里 if (in_array($requested_file, $allowed_files)) { // 合法文件,正常显示 include($requested_file); } else { // 非法请求,直接甩错误提示 echo "抱歉,你访问的页面不存在!"; }
小白友好说明
- 怎么加合法文件? 把你网站上真正需要通过这个参数访问的文件名,都写到
$allowed_files的方括号里,每个文件名用引号包起来,逗号分隔就行。 - 错误提示能改吗? 必须可以!把
echo后面的文字换成你想显示的内容,比如“非法请求,请返回首页”或者“页面未找到”。 - 其他编程语言怎么办? 逻辑完全一样!先搞个合法文件列表,再判断用户请求的文件在不在列表里,在就正常显示,不在就返回错误。举个Node.js的简单例子:
// Node.js版极简示例 const allowedFiles = ['inflatable.html', 'engine-parts.html']; const requestedFile = req.query.page; if (allowedFiles.includes(requestedFile)) { // 正常返回文件内容 res.sendFile(requestedFile); } else { // 返回错误提示 res.status(404).send("非法请求!"); }
额外提醒
- 千万别用「黑名单」(就是禁止某些非法文件名),黑客能想出各种绕过方法,白名单才是最安全的。
- 替换代码前记得备份原来的代码,万一出问题还能快速恢复。
内容的提问来源于stack exchange,提问作者Mortality Doesn't Code
相关产品推荐
相关产品推荐

