web-dev-qa-db-ja.com

レールのパラメータをフィルタリングする方法は?

Railsにはログフィルタリングが組み込まれているため、パスワードとクレジットカードを記録しません。そのためにはうまく機能しますが、カスタムログ(電子メールなど)をトリガーし、独自のパラメーターまたはその他のデータを一緒に送信する場合、パラメーターは明らかに自動フィルター処理されません。私はこれをRailsソースで探してみましたが、これまで運がありませんでした。

Railsを次のようにパラメータをフィルタリングするように構成し、データをRailsログから除外するために適切に動作します:

config.filter_parameters += [:password, :password_confirmation, :credit_card]

電子メール、APIコール、またはカスタム(非Rails)ログにダンプする前に、paramsハッシュから機密データをどのようにフィルタリングしますか?

42
chrishomer

いつでもexceptメソッドを使用できます:

params.except(:password, :password_confirmation, :credit_card)

それはリストからそれらを除外します。それらを「フィルタリング」するには、 この方法を試してください

34
tadman

Rails 4+

ログインのフィルタリングに関する補足事項Rails 4+:config.filter_parametersはapplication.rbから独自のイニシャライザーに移動されました。

config/initializers/filter_parameter_logging.rb

Rails.application.config.filter_parameters += [:password]
57
davegson

tadmanは正しく答えましたが、ここにいくつかの追加情報があります。

Application.rbで

config.filter_parameters += [:password, :password_confirmation, :credit_card]

カスタムロギングを行う場所:

f = ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters)
f.filter :order => {:credit_card => "4111111111111111"}

 => {:order=>{:credit_card=>"[FILTERED]"}} 
47
chrishomer

Railsコントローラメソッド内にいる場合は、単にrequest.filtered_parameters

既に提供されているものを使用することは常に良い選択です。乾杯!

17

@tadmanの回答を追加するだけです:

except を使用する場合、パラメータの最上位キーのみが削除されることに注意してください。例:

params = {
  search_query: 'foobar', 
  secret_key1: 'SENSITIVE_KEY_1', 
  auth_info: {secret_key_2: 'SENSITIVE_KEY2'}
}
params.except(:secret_key1, :secret_key2)

=> {:search_query=>"foobar", :auth_info=>{:secret_key_2=>"SENSITIVE_KEY2"}}

request.filtered_parametersを使用すると、これらのキーがconfig/application.rbにある場合、両方のキーがフィルタリングされます

config.filter_parameters += [:password]
4