読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Railsでログ上のパスワードやクレジット番号などの情報をフィルタリングする

Security Rails Tips

Railsのログ上にパスワードやクレジット番号など表示させたくない場合、filter_parametersに属性名を追加することでフィルタリングできます。


動作確認

  • Rails 4.1
# config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password]

# クレジットカード番号もフィルタリングする
# Rails.application.config.filter_parameters += [:password, :credit_card_number]


もし、Rails.application.config.filter_parameters += []の場合、次のようにpasswordcredit_card_numberがログに表示されてしまいます。

Started POST "/users" for 127.0.0.1 at 2014-12-06 14:02:35 +0900
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"", "authenticity_token"=>"IV2rjQ4ta9xPMTvvAMNOhp6XtgfIhh2nj7UpD8ZjHpQ=", "user"=>{"email"=>"test@test.com", "password"=>"secret", "credit_card_number"=>"1111-2222-3333-4444"}, "commit"=>"Create User"}


Rails.application.config.filter_parameters += [:password, :credit_card_number]を設定し、サーバーを再起動させると、ログの内容は次のようにフィルタリングされます。

Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"", "authenticity_token"=>"IV2rjQ4ta9xPMTvvAMNOhp6XtgfIhh2nj7UpD8ZjHpQ=", "user"=>{"email"=>"test@test.com", "password"=>"[FILTERED]", "credit_card_number"=>"[FILTERED]"}, "commit"=>"Create User"}


ちなみに、development環境だとデバッグログ出力がデフォルトになってますので、次のようにSQLの内容も表示されてしまい、そこにはパスワードとクレジットカード番号も表示されてしまいます。

Started POST "/users" for 127.0.0.1 at 2014-12-06 14:03:21 +0900
  ActiveRecord::SchemaMigration Load (0.1ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"", "authenticity_token"=>"IV2rjQ4ta9xPMTvvAMNOhp6XtgfIhh2nj7UpD8ZjHpQ=", "user"=>{"email"=>"test@test.com", "password"=>"[FILTERED]", "credit_card_number"=>"[FILTERED]"}, "commit"=>"Create User"}
   (0.2ms)  begin transaction
  SQL (0.4ms)  INSERT INTO "users" ("created_at", "credit_card_number", "email", "password", "updated_at") VALUES (?, ?, ?, ?, ?)  [["created_at", "2014-12-06 05:03:21.278415"], ["credit_card_number", "1111-2222-3333-4444"], ["email", "test@test.com"], ["password", "secret"], ["updated_at", "2014-12-06 05:03:21.278415"]]
   (1.1ms)  commit transaction
Redirected to http://localhost:3000/users/2
Completed 302 Found in 24ms (ActiveRecord: 2.1ms)

サンプルのため、平文でパスワードやクレジットカード番号をDBに保存していますが、商用では大切なデータですので暗号化してからDBに保存させてください。


いちおう、次のようにすれば、SQLログを出力しないようにできますが、そもそもdevelopment環境で実際のパスワードやクレジットカード番号を入力することはないと考えられるので、その他の有用なログまで削除してしまうのはどうかと思います。

# config/environments/development.rb
config.log_level = :info


以上です。

参考文献