10

我正在运行 Rails 3 并尝试从我们的日志中过滤敏感信息,这些信息是作为 post 参数传递的 JSON blob。例如,用户创建可能需要一个user使用 JSON 对象的字符串值调用的 post 参数。JSON 对象中的键之一是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 try to dup symbol

似乎将块传递给 filter_parameters 是不安全的,所以我想知道是否有另一种方法来解决这个问题。

4

4 回答 4

2

filter_parametersRails 测试套件中有一个将块传递给的示例:

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

为什么@Nesbitt 的回答被否决(在下方)?当然,它引用了测试套件中的代码,但该测试套件只是测试 ActionDispatch::Http::FilterParameters 中记录的功能:

如果给定一个块,则将参数哈希和所有子哈希的每个键和值传递给它,可以使用 String#replace 或类似方法替换值或键。

请在此处查看 Rails 3.x 的 API 文档中的注释。

我需要做同样的事情:将通过 HTTP POST 发送到 Rails 3 应用程序的 JSON blob 中的字段转换。在我的例子中,我只想包含一个字段的散列摘要,所以在 config/application.rb 中:

config.filter_parameters += [:password, lambda {|key, value|
  if key.to_s == 'my_key'
    value.replace(calculate_my_hash(value))
  end
}]
于 2016-04-07T17:48:32.027 回答
1

我正在开发一个 Rails 3 应用程序,并使用 Backbone.js。我在创建或更新记录时传递 JSON 对象。我覆盖了我的 Backbone 模型的 toJSON 函数并硬编码了一个密码参数,只是为了测试你的问题。就我而言,config.filter_parameters 只是 [:password],它会在日志中正确过滤密码参数。起初,我在提交 PUT 请求的更新中对此进行了测试。然后我在创建时使用 POST 请求对此进行了测试,以检查提交 POST 时是否有任何特殊错误。密码仍然被正确过滤。我错过了什么吗?

看起来 config.filter_parameters 无需传递块即可正常工作。

于 2011-07-21T09:12:11.847 回答
0

我在我们的应用程序中处理了同样的问题。我最终阻止了整个 JSON 字符串记录有安全数据的地方,然后为我想要记录的任何信息添加显式记录器。

于 2011-07-14T18:04:14.383 回答