关闭Yii2.0.48调试信息泄露漏洞需四步同步:一、入口文件强制定义YII_DEBUG=false且早于autoload;二、config/web.php中debug模块仅限YII_ENV_DEV分支注册;三、禁用错误堆栈与调试工具栏,验证errorAction生效、runtime/debug无写入;四、移除LogTarget中的yii\debug\LogTarget,关闭display_errors并确保error_log路径安全。

关闭 Yii 2.0.48 调试信息泄露漏洞,核心是切断调试模式的启动链和敏感信息输出通道。这不是改一个开关就能解决的问题,而是要从常量定义、模块注册、错误展示、日志输出四个层面同步清理。
强制禁用 YII_DEBUG 常量
YII_DEBUG 是整个调试体系的总闸,必须在框架加载前就锁死为 false:
- 打开 web/index.php(及 index-test.php 等所有入口文件),确认第一行是:
defined('YII_DEBUG') or define('YII_DEBUG', false);
且该行必须位于require __DIR__ . '/../vendor/autoload.php';之前 - 检查 common/config/main-local.php、backend/config/main-local.php 等本地配置文件,删除或注释掉任何重新定义
define('YII_DEBUG', true)的语句 - 临时加一行
var_dump(YII_DEBUG); die;到任意控制器 action 中,确认输出为 bool(false)
彻底移除 debug 模块注册
即使 YII_DEBUG=false,只要 debug 模块还在配置里,它仍会尝试加载类、初始化服务,带来额外开销和潜在风险:
- 打开 config/web.php,搜索
'debug',确保'bootstrap' => ['debug']和'modules' => ['debug' => [...]]只出现在if (YII_ENV_DEV) { ... }分支内 - 若在全局配置、
YII_ENV_PROD分支或无条件位置出现,直接整段删除 - 检查所有
*-local.php文件,同样不能包含 debug 模块定义 - 执行
php yii debug/info,应返回 “Module not found: debug” 或报错,而非显示模块信息
关闭错误堆栈与调试工具栏
验证是否真正生效,不能只看配置,要看实际响应:
- 访问任意 URL(如 /nonexistent),不应出现带完整调用栈的白屏;应跳转到你配置的
errorAction页面(如site/error) - 页面右下角不应出现 Yii 调试工具栏(Debug Toolbar)
- 查看 runtime/debug/ 目录,确认该目录不存在,或存在但无新文件写入
- 触发数据库异常(如故意写错 SQL),响应体中不能包含 SQL 语句、模型路径、绝对文件路径等内部信息
收紧日志与错误输出行为
防止调试信息通过日志或 PHP 原生机制泄露:
- 在 config/web.php 的
'components' => ['log' => [...]]中,确认没有yii\debug\LogTarget实例;可用Yii::getLogger()->getTargets()检查运行时目标列表 - 确保
error_reporting和display_errors在生产环境被关闭:在 web/index.php 顶部添加ini_set('display_errors', '0');,并确认 Web 服务器(Nginx/Apache)未开启 PHP 错误回显 - 检查 php.ini 或运行时配置,
log_errors = On应启用,但error_log路径需设为安全位置,不可被 Web 访问
不复杂但容易忽略


















