ログに残したくない情報
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などに出力することは時々あるので覚えておくと便利