10

Rails 3 を実行していて、ポスト パラメータとして渡される JSON BLOB である機密情報をログから除外しようとしています。たとえば、ユーザーの作成userでは、JSON オブジェクトである文字列値で呼び出される post パラメーターを取る場合があります。JSON オブジェクトのキーの 1 つは であり、passwordこれをログから除外したいと考えています。これを行うための最良の方法は、filter_params に次のようにブロックを追加することでした。

keys_to_filter = ['password', 'password_confirmation']
config.filter_parameters << lambda do |k,v|
  if v.is_a? String
    keys_to_filter.each do |key|
      # Match "key":"<filter_out>", or "key":"<filter_out>"}, allowing for whitespace
      v.sub!(/("\s*#{key}\s*")\s*:\s*"[^,\}]*"\s*([,\}])/, "\\1:\"[FILTERED]\"\\2")
    end
  end
end

これにより、filter_params にブロックが追加され、別の質問で説明されているエラーが発生します: Rails: ParameterFilter::compiled_filter attempts to dup symbol

ブロックを filter_parameters に渡すのは安全ではないようです。この問題を解決する別の方法があるかどうか疑問に思っています。

4

4 に答える 4

2

Rails テスト スイートfilter_parametersにブロックを渡す例があります。

config.filter_parameters += [ :foo, 'bar', lambda { |key, value|
  value = value.reverse if key =~ /baz/
 }]
于 2011-06-03T18:22:28.557 に答える
1

Rails 3 アプリを開発しており、Backbone.js を使用しています。レコードを作成または更新するときに JSON オブジェクトを渡しています。問題をテストするためだけに、バックボーン モデルの toJSON 関数を上書きし、パスワード パラメータをハードコーディングしました。私の場合、config.filter_parameters は単に [:password] であり、ログでパスワード パラメータを正しくフィルタリングします。最初に、PUT リクエストを送信する update でこれをテストしました。次に、POST を送信するときに特別なバグがあるかどうかを確認するためだけに、POST リクエストを使用してこれをテストしました。パスワードは引き続き正しくフィルタリングされます。何か不足していますか?

ブロックを渡す必要なく config.filter_parameters が正しく動作するようです。

于 2011-07-21T09:12:11.847 に答える
0

私は私たちのアプリケーションで同じ問題を扱ってきました。最終的に、JSON文字列全体が安全なデータがある場所でログに記録されないようにブロックし、ログに記録したい情報に対して明示的なロガーを追加しました。

于 2011-07-14T18:04:14.383 に答える