【问题标题】:Manually filter parameters in Rails在 Rails 中手动过滤参数
【发布时间】:2011-09-03 09:19:47
【问题描述】:

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

我想它会是这样的:

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

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

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

经过几分钟的霰弹枪射击,我发现这是这样做的方法:

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

【讨论】:

  • 谢谢。这对 sinatra 应用很有帮助。
  • @IsaacBetesh 如何在这段代码中使用过滤后的值:session[:user] = params[:user][:name]?
  • 我不明白这个问题,@sahil。能给我举个例子吗?和这个问题有关系吗?
  • @IsaacBetesh,我正在后端生成一个密码,该密码应该在发布请求中发送。我可以将其过滤并在请求中发送吗?例如,生成的密码在变量some_password = "password" 中,现在我想对其进行过滤并在请求中发送。
  • @sahil 过滤参数是为了防止从客户端发送的数据被记录到服务器上。服务器发送给客户端的数据默认不记录在服务器上,如果你要记录它,你可以按照 steven-xu 的方法。
【解决方案2】:

查看config/application.rb文件,最后有一行:

config.filter_parameters += [:password]

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

编辑

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

这是一种蛮力方法:

  1. 使用CGI::parse(URI.parse(my_url_address_with_params).query) 解析查询以获得参数/值的哈希(注意:值实际上存储为数组;here is the discussion)。
  2. 找到要过滤掉的参数,并用文字 *filtered* 替换值。
  3. 直接致电Rails.logger.info(或debug)进行登录。

以下是您在依赖 Rails 神奇的类和方法时应该深入研究的内容:

在 Rails 3 中,实现此目的的代码似乎存在于 ActionDispatch::Http(尤其是 ParameterFilter,方法 `filtered_pa​​rameters')中。该文档可在API Dock 获得(或者说实话,非常 很少的文档)。您可以查看源代码以了解其工作原理。

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

【讨论】:

  • 对不起。请看我的澄清。我知道 Rails 在记录参数之前会对其进行过滤,并且我知道如何添加到过滤器中。我想做的是将相同的过滤器应用于另一个哈希,然后记录它。
  • 感谢您的回答。太糟糕了,目前还没有一个简单的解决方案。我不介意自己实现过滤器。
  • 为了记录,我在摆弄了一段时间后sorted it out
  • 很高兴听到这个消息!老实说,我没有精力玩它,但很高兴你找到了解决方案:)
【解决方案3】:

基于 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]"
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多