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

时间:2011-03-10 20:49:17

标签: ruby-on-rails security json ruby-on-rails-3 actiondispatch

我正在运行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":"<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 tries to dup symbol

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

4 个答案:

答案 0 :(得分:2)

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

  

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

请参阅Rails 3.x here的API文档中的注释。

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

va_arg

答案 1 :(得分:1)

有一个示例将块传递给Rails test suite中的filter_parameters

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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