ログに残したくない情報
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
こうするとparamsにpasswordやcard_numberがあれば必ずその値は[FILTERED]になります。
{
  email: 'test@test.test',
  password: '[FILTERED]'
}
下のようにネストされていても、[FILTERED]にしてくれます。
{
  user: {
    password: '[FILTERED]',
    card: {
      card_number: '[FILTERED]'
    }
  }
}
手作業ではネストされてるところはうっかりしがちですが、ちゃんとフィルタリングしてくれるのはありがたい。
これでとりあえず安心
もう少しかゆいところに届くように
しかし、実際はパスワードを確認のためにユーザーに2回パスワードを入れてもらうこともありますよね。
passwordとpassword_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などに出力することは時々あるので覚えておくと便利
