yii2日志目标掩码

时间:2015-05-28 15:28:01

标签: logging yii2

我正在使用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全局。

还有其他建议吗?

2 个答案:

答案 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']    
                ],
            ],
        ],