Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
74
Help us understand the problem. What is going on with this article?
@kakkunpakkun

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

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

74
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kakkunpakkun
freeeでおじさんやってます RubyとRailsの人でしたが最近はあんまやってないです。flutter, dart, firebaseが最近の技術的な関心事です(`・ω・´)ゝ
freee
スモールビジネスのバックオフィス業務をテクノロジーで自動化し、日本のスモールビジネスを元気にする

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
74
Help us understand the problem. What is going on with this article?