Rails:从日志中过滤JSON参数中的敏感数据

我正在运行Rails 3并尝试从我们的日志中过滤敏感信息,这些日志是作为post参数传递的JSON blob。 例如,用户创建可能会使用一个名为user的post param,其字符串值是JSON对象。 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":"", or "key":""}, allowing for whitespace v.sub!(/("\s*#{key}\s*")\s*:\s*"[^,\}]*"\s*([,\}])/, "\\1:\"[FILTERED]\"\\2") end end end 

这会向filter_params添加一个块,这会导致另一个问题中描述的错误: Rails:ParameterFilter :: compiled_filter尝试重复符号

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

为什么@ Nesbitt的答案被低估(下面)? 当然,它引用了测试套件中的代码,但该测试套件只是测试ActionDispatch :: Http :: FilterParameters中记录的function:

如果给出了一个块,则将params散列和所有子散列的每个键和值传递给它,可以使用String#replace或类似方法替换值或键。

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

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

 config.filter_parameters += [:password, lambda {|key, value| if key.to_s == 'my_key' value.replace(calculate_my_hash(value)) end }] 

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

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

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

 config.filter_parameters += [ :foo, 'bar', lambda { |key, value| value = value.reverse if key =~ /baz/ }] 

我在申请中处理了同样的问题。 我最终阻止整个JSON字符串从有安全数据的日志记录中锁定,然后为我想要记录的任何信息添加显式记录器。