我正在使用Yii2框架,需要找到一种方法来保护发送到日志文件的敏感数据。
考虑以下日志转储
$_POST = [
'_csrf' => 'VzVDNC03aXk9BAhOYEMPPzkDG2BvQwELDwZuV2VzUDUjTSJuRl4FCQ=='
'CreditCardForm' => [
'card_number' => '4111111111111111'
'exp_month' => '02'
'exp_year' => '16'
'cardholder_name' => 'Jane Doe'
'agreement' => '1'
]
我想以可移植的方式修改\ yii \ log \ Target.getContextMessage()的行为而不触及框架文件,以便屏蔽信用卡号的前12位数。
我目前的想法是在将值复制到执行处理的模型后改变$ _POST全局。
还有其他建议吗?
答案 0 :(得分:1)
您可以选择使用配置文件将日志路由的配置更改为不包括POST,并更改logVars
的内容。如果你根本不需要超级全球,你可以将它设置为[]
例如:
'components' => [
'log' => [
'targets' => [
...
'logVars' = ['_GET', '_FILES', '_COOKIE', '_SESSION', '_SERVER'],
...
]
]
另一种选择是覆盖您使用的Target
- 类,并在返回数据之前更新getContextMessage()
函数以删除/模糊信用卡号。
答案 1 :(得分:1)
在web / index.php中,我添加了以下内容
global $SAFE_POST;
if(is_array($_POST)) {
$SAFE_POST = $_POST;
array_walk_recursive($SAFE_POST,function(&$value,$key) {
if($key == 'card_number' && is_string($value)) {
if(strlen($value) <= 4)
$value = str_repeat('X',strlen($value));
else
$value = str_repeat('X',strlen($value)-4).substr($value,-4);
}
});
}
然后我将LogTarget配置为使用新的全局。
log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning', 'info'],
'logVars' => ['_GET', 'SAFE_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']
],
],
],