Posted at

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

More than 3 years have passed since last update.


ログに残したくない情報

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などに出力することは時々あるので覚えておくと便利