【问题标题】:Rails Filter Parameters Filtering Too MuchRails 过滤器参数过滤过多
【发布时间】:2015-03-05 19:05:50
【问题描述】:

在我的过滤器参数初始化程序中,我过滤掉了所有与密码相关的参数:

# config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password, :password_confirmation]

但是过滤掉的参数比我预期的要多。它看起来像是从日志中过滤出来的任何名称中带有“密码”的东西。

 {"password_invite_form"=>"[FILTERED]"}

有什么方法可以防止过滤参数的模式匹配,并匹配我设置的精确参数?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    如果要显式控制模式匹配,可以使用正则表达式,而不是字符串或符号。

    # config/initializers/filter_parameter_logging.rb
    Rails.application.config.filter_parameters += [/^password$/, /^password_confirmation$/]
    

    这将告诉 Rails 准确过滤“password”和“password_confirmation”,但不过滤包含“password”作为子字符串的其他参数。

    【讨论】:

    • 我真的很惊讶文档没有更多地强调这一点。顺便提到了here,但没有提到这同样适用于日志过滤。在我维护的一个应用程序中,旨在隐藏 dlntin 字段的过滤器正在影响 dln_statereporting 字段。
    • 值得注意的是,对于未来的访问者,即使使用正则表达式,您也可以进行“深度过滤”,至少在 Rails 5 中,但点分隔符确实需要转义。例如在我的情况下,过滤器/attachments\.content$/ 很高兴与嵌套附件的content_type 属性不匹配,也不匹配任何其他模型的content 属性。
    【解决方案2】:

    是的。您将不得不修补正在过滤掉包含“密码”的参数的导轨部分。

    如果这是我的项目,我会让 rails 继续做它的事情,只是为该参数选择一个不同的名称。如果您需要有关如何操作的帮助,请发表评论。

    【讨论】: