やりたいこと
ログを出すときに、ユーザから送られてきたパスワードや、パスワード確認にセットされているパスワード文字列がログに書かれてしまうのをなんとかする。
個別に処理するのではなく、logを出す方で自動的にマスクして出力するようにする。
前提
PHP 7
Lumen 5
ログに monologを使っている
やりかた
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;
use Monolog\Formatter\JsonFormatter;
:
(割愛)
:
$app->configureMonologUsing(function ($monolog) {
$monolog->pushHandler((
new StreamHandler('php://stdout', Logger::DEBUG)
)->setFormatter(new JsonFormatter()));
$monolog->pushProcessor(function($record){
array_walk_recursive($record, function(&$val, $key){
if (($key === 'password')||($key === 'password_confirmation')) {
$val = '********';
}
});
return $record;
});
return $monolog;
});
:
(割愛)
:
\Monolog\Logger::StreamHandler では、
第一引数 : php://stdout
標準出力
第二引数 : Logger::DEBUG デバックレベルで出力する
setFormatter(new JsonFormatter())) : JSON形式で出力する
の設定になっている(AWS CloudWatch Logs に出す想定)
ログ出力内容を変更したり追加したりする場合は、\Monolog\Logger::pushProcessorを使う。
ここに、既存の processrを追加したりしてとても便利だったりする。
独自のコールバックを書くこともできる。
引数の $record
に、ログに書き出す内容の配列が渡されるので、その中の password
, password_confirmation
の値を ********
に上書きする処理にする。
array_walk_recursive は、第一引数に指定した配列の全ての要素に、ユーザー関数を再帰的に適用してくれる便利なやつ。
感想
でも遅くなりそうな予感。