核心风险是调试模式开启导致敏感信息泄露,修复需关闭YII_DEBUG、禁用错误回显、限制日志级别为error/warning、设置traceLevel=0、禁止Web访问runtime目录、避免记录敏感字段,并改用结构化日志。

Yii 2.0.48 日志信息泄露漏洞的核心风险在于:调试模式开启、错误信息直出、日志内容含敏感路径或凭证,且未做访问控制。修复不依赖升级,关键在配置层快速堵漏。
关闭调试模式与错误回显
打开 protected/config/main.php(或 config/web.php),检查并执行以下操作:
- 删除或注释掉顶部类似
defined('YII_DEBUG') or define('YII_DEBUG', true);的行,确保YII_DEBUG为false - 在
'components' => [ ... ]中确认没有启用'log'路由器时包含'trace'或'info'级别;若存在,将'levels'限定为['error', 'warning'] - 在入口文件 index.php 顶部添加:
ini_set('display_errors', '0');,彻底屏蔽 PHP 错误输出到响应体
限制日志内容与存储权限
日志本身若含绝对路径、SQL 模板、用户凭证片段,就构成泄露。需主动收敛:
- 在
'log' => ['targets' => [...]]配置中,设置'traceLevel' => YII_DEBUG ? 3 : 0,生产环境禁用调用栈 - 确保 runtime/logs/ 目录仅对 Web 服务器进程(如
www-data)可写,禁止 Web 访问——通过 Nginx/Apache 配置禁止/runtime/和/protected/的 HTTP 访问 - 避免在日志中记录敏感字段:不在
Yii::info()或Yii::error()中直接传入密码、密钥、完整 token;可用占位符替代,如'api_key' => '***hidden***'
加固日志目标输出方式
默认 FileTarget 输出纯文本,易被扫描;结构化日志更可控,也便于后续脱敏处理:
- 不使用
ConsoleTarget或EmailTarget输出敏感信息到终端或邮件 - 若用
DbTarget,确保数据库连接不走公网,且system_log表不开放给低权限账号查询 - 推荐改用 JSON 格式输出(需自定义或扩展
FileTarget),每条日志明确字段如level、category、message,剔除$_SERVER或debug_backtrace()类原始上下文
验证是否生效
完成配置后,手动触发一个异常(如访问不存在的路由或抛出 throw new Exception('test');),观察响应:
- HTTP 响应头中不应出现
X-Powered-By: Yii Framework/2.0.48(可通过headers_sent()或中间件移除) - 页面只显示通用错误页(如 “500 Server Error”),无堆栈、无路径、无 SQL 片段
- 查看 runtime/logs/app.log,确认无
YII_DEBUG=true时的 trace 级日志,且无$_POST、$_COOKIE明文记录


















