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

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

我正在维护一个内置于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字段的转储?

dgjrabp2

dgjrabp21#

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

'log' => [
    'traceLevel' => YII_DEBUG ? 3 : 0,
    'targets' => [
        [
            'class' => 'yii\log\FileTarget',
            'levels' => ['error', 'warning'],
            'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER'],
        ],
    ],
],

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

ldxq2e6h

ldxq2e6h2#

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

'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' => 'example@example.com'
        'password' => 'mysecretpassword'
    ]
]

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

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',

相关问题