手动过滤Rails中的参数

时间:2011-05-27 12:43:39

标签: ruby-on-rails

如何使用我的应用程序的参数过滤器手动过滤哈希?

我想它会像这样:

Rails.application.filter :password => 'pass1234'
  # => {:password => '[FILTERED]'}

编辑(澄清):我知道Rails在写入日志时会过滤params哈希。我想要做的是将相同的过滤器应用于我的特权的不同散列,然后用Rails.logger.info之类的内容将其写入日志。我正在调用远程HTTP查询作为我的应用程序的一部分(因为大多数后端通过远程API操作),并且我正在记录传递的URL和参数。我想拥有日志,但也确保没有敏感的参数出现在那里。

3 个答案:

答案 0 :(得分:48)

经过几分钟的枪击后,我发现这是做到这一点的方法:

filters = Rails.application.config.filter_parameters
f = ActionDispatch::Http::ParameterFilter.new filters
f.filter :password => 'haha' # => {:password=>"[FILTERED]"}

答案 1 :(得分:19)

请参阅config/application.rb文件,最后有一行:

config.filter_parameters += [:password]

这样“密码”参数不会显示在日志中,但您仍然可以正常访问该值。

修改

似乎最初误解了“过滤器”的含义。至于澄清的问题,我不知道如何处理真正的Rails方式

这是一种蛮力方法:

  1. 使用CGI::parse(URI.parse(my_url_address_with_params).query)解析查询以获取param / values的哈希值(注意:值实际存储为数组; here is the discussion)。
  2. 找到要过滤掉的参数,并用文字*filtered*替换值。
  3. 直接致电Rails.logger.info(或debug)进行记录。
  4. 以下是依赖Rails魔法类和方法时应该深入研究的内容:

    在Rails 3中,执行该技巧的代码似乎存在于ActionDispatch::Http(特别是ParameterFilter,方法`filtered_pa​​rameters')。该文档可在API Dock获得(或者,说实话,非常小文档)。您可以查看来源以了解其工作原理。

    我对Rails内部的了解不足以提出任何其他建议。我相信有更好理解它的人可能会有更多的帮助。

答案 2 :(得分:2)

在Steven Xu的上述答案的基础上,我在我的rails应用程序中创建了这个初始化程序:

class ActionController::Parameters
  def filtered
    ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters).filter(self)
  end
end

让我打电话给params.filtered

[1] pry(#<LessonsController>)> params.filtered
{
  "controller" => "lessons",
  "action"     => "search",
  "locale"     => "en"
}
[2] pry(#<LessonsController>)> params[:password] = "bob"
"bob"
[3] pry(#<LessonsController>)> params.filtered
{
  "controller" => "lessons",
  "action"     => "search",
  "locale"     => "en",
  "password"   => "[FILTERED]"
}