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字符串从有安全数据的日志记录中锁定,然后为我想要记录的任何信息添加显式记录器。