当我调用warning()或info()时,如何防止post变量出现在Yii2日志中?

h4cxqtbf  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(310)

我正在维护一个内置于Yii2的应用程序,我想使用Yii::warning()来写日志消息。这很好,除非我在用户登录序列中记录事件。
用户名和密码作为POST变量发送。这些是不应该在日志文件中捕获的敏感信息。

  1. $errorno = ldap_errno($this->link);
  2. $errorstr = ldap_err2str($errorno);
  3. Yii::warning("LDAP error: $errorno: $errorstr");

上面的代码导致出现一个日志警告,其中包含我的ldap错误消息,但该警告包含一个完整的堆栈跟踪和POST变量。
即使仅在LDAP连接出现问题时才写入警告,它也可以包含当时任何用户的凭据,从服务器管理员到CEO。
我如何在Yii中记录与验证相关的事件的警告,而不获取完整的堆栈跟踪和POST字段的转储?

dgjrabp2

dgjrabp21#

您可以配置哪些PHP超全局变量被导出到每个日志目标的日志中。在您的配置文件中,例如:

  1. 'log' => [
  2. 'traceLevel' => YII_DEBUG ? 3 : 0,
  3. 'targets' => [
  4. [
  5. 'class' => 'yii\log\FileTarget',
  6. 'levels' => ['error', 'warning'],
  7. 'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER'],
  8. ],
  9. ],
  10. ],

上面的示例显示了省略logVars属性时的等效默认设置。

ldxq2e6h

ldxq2e6h2#

为了避免日志中的敏感数据泄漏,您可以简单地屏蔽日志文件中的任何变量,并且对于任何类型的级别,而不仅仅是警告。

  1. 'log' => [
  2. 'traceLevel' => YII_DEBUG ? 3 : 0,
  3. 'targets' => [
  4. [
  5. 'class' => 'yii\log\FileTarget',
  6. 'levels' => ['error', 'warning'],
  7. 'maskVars' => [
  8. // current vars in vendor/yiisoft/yii2/log/Target.php::$maskVars
  9. '_SERVER.HTTP_AUTHORIZATION',
  10. '_SERVER.PHP_AUTH_USER',
  11. '_SERVER.PHP_AUTH_PW',
  12. // Filter and mask any POST vars. Examples:
  13. // '_POST.add_var_name_here'
  14. // '_POST.your_form_name.your_field_name'
  15. // see: vendor/yiisoft/yii2/log/Target.php::$maskVars
  16. // see: vendor/yiisoft/yii2/log/Target.php::getContextMessage()
  17. '_POST.LoginForm.email',
  18. '_POST.LoginForm.password',
  19. ],
  20. ],
  21. ],
  22. ],

现在练习如何确定和设置maskVars。假设您在日志中看到如下内容:

  1. $_POST = [
  2. 'LoginForm' => [
  3. 'email' => 'example@example.com'
  4. 'password' => 'mysecretpassword'
  5. ]
  6. ]

屏蔽邮箱和密码只需在maskVars配置中添加'_POST.LoginForm.email''_POST.LoginForm.email'即可。

PS:通过这种方式,你可以屏蔽任何敏感的全局变量:

  1. '_SERVER.add_var_name_here',
  2. '_FILES.add_var_name_here',
  3. '_COOKIE.add_var_name_here',
  4. '_SESSION.add_var_name_here',
  5. '_POST.add_var_name_here',
  6. '_GET.add_var_name_here',
展开查看全部

相关问题