ThinkPHP 5.1.30存在未授权访问风险,涉及默认路由、调试接口、多语言加载点及未鉴权管理API;需关闭调试模式、限制lang参数路径解析、强制管理接口鉴权,并升级至5.1.38+。

ThinkPHP 5.1.30 存在未授权访问风险,主要集中在部分默认路由、调试接口、多语言加载点及未鉴权的管理类 API 上。这类漏洞不依赖用户登录态即可触发,可能直接暴露配置文件、日志内容甚至执行任意代码。修复不是加一条 if 判断就能解决,而是要从路径控制、权限校验、输入规范三方面同步收紧。
关闭调试模式并清理敏感入口
调试模式是未授权访问的“放大器”。只要 APP_DEBUG = true,框架就可能暴露路由映射、数据库配置、错误堆栈等关键信息。
- 检查
app.php或环境配置文件,确认'debug' => false已生效; - 删除或重命名
public/router.php(若存在且为测试用); - 清空
runtime/目录下所有子目录和.log、.php文件; - Nginx/Apache 配置中禁止直接访问
runtime/、config/、application/等敏感路径,例如:location ~ ^/(runtime|config|application)/ { deny all; }
限制多语言参数 lang 的路径解析范围lang= 参数常被用于任意文件读取,如 /index/ajax/lang?lang=../../database。
- 不要拼接用户输入构造语言文件路径;
- 改用白名单映射方式,例如:
$langMap = ['zh-cn' => 'zh-cn.php', 'en-us' => 'en-us.php']; $lang = input('lang', 'zh-cn'); if (!isset($langMap[$lang])) { throw new HttpException(400, 'Invalid language'); } include APP_PATH . 'lang/' . $langMap[$lang]; - 所有涉及路径拼接的操作,必须先调用
realpath()规范化,并判断是否落在允许根目录内。
强制鉴权所有管理类接口
ThinkPHP 5.1.30 中部分控制器(如 admin/api.Update 类似路径)未校验登录态,导致未授权调用。
- 在路由定义或控制器构造方法中统一拦截:
if (!session('?admin_id')) { abort(403, 'Access denied: login required'); } - 对于 API 接口,建议统一使用中间件校验 token 或 session,避免在每个方法里重复写判断;
- 禁用自动路由(
'url_route_must' => true),关闭__construct中未加保护的initialize()调用链。
升级是最可靠手段
官方已在 5.1.31 版本中修复多个未授权访问相关逻辑缺陷,包括:
- 多语言参数路径规范化缺失;
-
think\template\driver\File类中缓存路径拼接绕过; -
think\Request::param()对特殊键名(如_method)的过滤增强。
务必升级至5.1.38+(最终稳定版),不可停留在 5.1.30 或仅打补丁。
不复杂但容易忽略



















