Posted at

Lumenでpasswordの中身をマスクしてログに出力する

More than 1 year has passed since last update.


やりたいこと

ログを出すときに、ユーザから送られてきたパスワードや、パスワード確認にセットされているパスワード文字列がログに書かれてしまうのをなんとかする。

個別に処理するのではなく、logを出す方で自動的にマスクして出力するようにする。


前提

PHP 7

Lumen 5

ログに monologを使っている


やりかた


bootstrap/app.php


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 は、第一引数に指定した配列の全ての要素に、ユーザー関数を再帰的に適用してくれる便利なやつ。


感想

でも遅くなりそうな予感。