我正在维护一个用 Yii2 构建的应用程序,我想使用 Yii::warning() 来写入日志消息。这很好,除非我在用户登录序列中记录事件。
用户名和密码作为 POST 变量发送。这些是敏感信息,不应在日志文件中捕获。
$errorno = ldap_errno($this->link);
$errorstr = ldap_err2str($errorno);
Yii::warning("LDAP error: $errorno: $errorstr");
上面的代码会导致出现日志警告,其中包含我的 ldap 错误消息,但该警告包含完整的堆栈跟踪和 POST 变量。
即使仅在 LDAP 连接出现问题时才写入警告,它也可能包含当时任何用户的凭据,从服务器管理员到 CEO。
如何在 Yii 中记录与身份验证相关的事件的警告,而无需获取完整的堆栈跟踪和 POST 字段转储?
您可以为每个日志目标配置将哪些 PHP 超全局变量导出到日志。在您的配置文件中,例如:
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER'],
],
],
],
省略
logVars
属性时等效的默认设置如上例所示。
为了避免日志中的敏感数据泄漏,您可以简单地屏蔽日志文件中的任何变量,并且对于任何类型的级别,不仅仅是警告。
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'maskVars' => [
// current vars in vendor/yiisoft/yii2/log/Target.php::$maskVars
'_SERVER.HTTP_AUTHORIZATION',
'_SERVER.PHP_AUTH_USER',
'_SERVER.PHP_AUTH_PW',
// Filter and mask any POST vars. Examples:
// '_POST.add_var_name_here'
// '_POST.your_form_name.your_field_name'
// see: vendor/yiisoft/yii2/log/Target.php::$maskVars
// see: vendor/yiisoft/yii2/log/Target.php::getContextMessage()
'_POST.LoginForm.email',
'_POST.LoginForm.password',
],
],
],
],
现在练习一下如何确定和设置maskVars。假设您在日志中看到类似以下内容:
$_POST = [
'LoginForm' => [
'email' => '[email protected]'
'password' => 'mysecretpassword'
]
]
要屏蔽电子邮件和密码,您只需将
'_POST.LoginForm.email'
和 '_POST.LoginForm.password'
添加到 maskVars 配置即可。
PS:通过这种方式,您可以从全局变量中屏蔽任何敏感变量:
'_SERVER.add_var_name_here',
'_FILES.add_var_name_here',
'_COOKIE.add_var_name_here',
'_SESSION.add_var_name_here',
'_POST.add_var_name_here',
'_GET.add_var_name_here',