LoginSignup
94
82

More than 5 years have passed since last update.

Railsのlogに出したくない情報をちゃんと出さないようにする

Posted at

ログに残したくない情報

Webアプリケーションを開発していると時々生のままではログに残したくない情報ってありますよね。
パスワード、クレジットカード番号やCVCなんかは残したくないものの代表じゃないかと思います。

よくやる方法

initializersの中でこういうコードを入れるか、

Rails.application.config.filter_parameters += ['password', 'card_number']

application.rbの中でこうするかがよくやる方法じゃないかと。

module TestRailsApp
  class Application < Rails::Application
    config.filter_parameters += ['password', 'card_number']
  end
end

こうするとparamspasswordcard_numberがあれば必ずその値は[FILTERED]になります。

{
  email: 'test@test.test',
  password: '[FILTERED]'
}

下のようにネストされていても、[FILTERED]にしてくれます。

{
  user: {
    password: '[FILTERED]',
    card: {
      card_number: '[FILTERED]'
    }
  }
}

手作業ではネストされてるところはうっかりしがちですが、ちゃんとフィルタリングしてくれるのはありがたい。

これでとりあえず安心

もう少しかゆいところに届くように

しかし、実際はパスワードを確認のためにユーザーに2回パスワードを入れてもらうこともありますよね。
passwordpassword_confirmationみたいに。

そのとき、

config.filter_parameters += ['password', 'card_number']

という書き方ではpassword_confirmationの方がそのままログに出力されてしまい、せっかくpassword[FILTERED]になってても意味がありません。
でも、いちいち

config.filter_parameters += ['password', 'password_confirmation']

というように指定を増やしていくのも大変ですよね。忘れそうだし。

そういう場合を考えて正規表現でのフィルタリングが可能になっています。

config.filter_parameters += [/password/]

雑にこんな風にするだけでもかなり防げます。

passwordという名前が入っている場合はたいていログに残したくないものなのでこうしておくのがいいかなと思ってます。

ActionDispatch::Http::ParameterFilterを使う

ちなみにこの[FILTERED]にする仕組みはActionDispatch::Http::ParameterFilterを使って実現されています。

なので、railsのlogger以外のところでも同様のことをやりたい場合はこういうことも出来ます。

filter = ActionDispatch::Http::ParameterFilter.new([/password/])
filter.filter(params)

rails以外のloggerなどに出力することは時々あるので覚えておくと便利

94
82
1

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
94
82