ThinkPHP 5.1.17 无官方CVE文件包含漏洞,常见报错多因配置错误或路径拼接失控;修复需堵住参数注入、加固加载逻辑、升级至5.1.40+并关闭debug模式。

ThinkPHP 5.1.17 存在文件包含类风险,但需明确:该版本官方未披露独立的“文件包含漏洞(LFI)CVE”,实际生产中出现的类似报错(如 include(): Filename cannot be empty 或 Failed opening required)多为配置错误、路径拼接失控或反序列化链间接触发,并非传统意义上的可控include($_GET['file'])型漏洞。修复重点在于堵住参数注入路径、加固加载逻辑、消除空路径隐患。
检查并清理危险的动态文件加载点
框架本身不直接暴露include参数,但业务代码或第三方扩展可能引入风险:
- 搜索项目中所有
include、require、include_once、require_once语句,重点关注参数来自input()、$_GET、$_POST或路由变量的位置 - 禁用或重写类似
include APP_PATH . 'template/' . input('tpl') . '.php'这类拼接逻辑;统一改用白名单机制,例如:$allowed = ['index', 'user', 'admin']; $tpl = input('tpl'); if (!in_array($tpl, $allowed)) { throw new HttpException(404); } - 检查自定义中间件、行为(hook)、模板引擎扩展是否动态加载文件,确认其文件名来源是否经过校验
修复空文件名错误(常见诱因)
报错include(): Filename cannot be empty往往源于路径生成失败,而非恶意利用:
- 检查
config/template.php中的view_path、view_suffix等配置是否为空或含非法字符 - 确认
app/目录下是否存在缺失的控制器、模型或视图文件——框架尝试加载不存在的模板时,可能因路径解析为空而触发该错误 - 临时在
thinkphp/library/think/View.php的fetch()方法开头添加日志:file_put_contents(RUNTIME_PATH.'view_debug.log', $template.PHP_EOL, FILE_APPEND);,定位具体哪个模板路径为空
升级与关键配置加固
5.1.17 属于较老版本(发布于2019年),已知存在多个未修复漏洞链(如RCE、反序列化),仅修单点不治本:
立即学习“PHP免费学习笔记(深入)”;
- 升级至
5.1.40+(当前5.1系列最终稳定版),该版本修复了Request::filterValue绕过、Windows类反序列化利用链等关键问题 - 确保
app_debug => false,关闭调试模式,防止错误堆栈泄露路径和类名,降低攻击者构造利用链的可能性 - 在
php.ini中设置open_basedir限制脚本可访问目录范围,阻断跨目录文件读取尝试 - 若使用Nginx,添加规则拦截含
O:、s:、a:且URL中含base64或unserialize的请求
验证修复效果
修复后需主动验证是否仍存在路径控制面:
- 尝试访问
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1,应返回404或500,而非执行phpinfo() - 向所有接收字符串参数的接口(如
input('file')、input('template'))传入../config/database.php等路径,确认返回404或空内容,而非敏感配置泄露 - 检查
runtime/log/目录下是否有新增的Warning: include(): Filename cannot be empty日志,确认空路径问题已根除



















