LoginSignup
1

More than 5 years have passed since last update.

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

Posted at

やりたいこと

ログを出すときに、ユーザから送られてきたパスワードや、パスワード確認にセットされているパスワード文字列がログに書かれてしまうのをなんとかする。
個別に処理するのではなく、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 は、第一引数に指定した配列の全ての要素に、ユーザー関数を再帰的に適用してくれる便利なやつ。

感想

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1