【问题标题】:How to filter parameters in rails?如何过滤rails中的参数?
【发布时间】:2026-01-14 21:35:01
【问题描述】:

Rails 内置了日志过滤功能,因此您无需记录密码和信用卡。效果很好,但是当您想要触发自定义日志(例如发送电子邮件)并发送您自己的参数或其他数据时,这些参数显然不会自动过滤。我一直在挖掘并试图在 rails 源中找到它,但到目前为止还没有运气。

我已将 rails 配置为过滤参数,如下所示,它可以正常工作以将数据保留在 rails 日志之外:

config.filter_parameters += [:password, :password_confirmation, :credit_card]

在将敏感数据转储到电子邮件、API 调用或自定义(非 Rails)日志之前,您将如何从 params 哈希中过滤敏感数据?

【问题讨论】:

    标签: ruby-on-rails ruby filtering


    【解决方案1】:

    Rails 4+

    在 Rails 4+ 中过滤日志的旁注:config.filter_parameters 已从 application.rb 移至它自己的初始化程序。

    config/initializers/filter_parameter_logging.rb

    Rails.application.config.filter_parameters += [:password]
    

    【讨论】:

    【解决方案2】:

    只是添加@tadman 答案:

    使用except时,请注意它只会删除参数的*键,例如:

    params = {
      search_query: 'foobar', 
      secret_key1: 'SENSITIVE_KEY_1', 
      auth_info: {secret_key_2: 'SENSITIVE_KEY2'}
    }
    params.except(:secret_key1, :secret_key2)
    
    => {:search_query=>"foobar", :auth_info=>{:secret_key_2=>"SENSITIVE_KEY2"}}
    

    使用request.filtered_parameters 将过滤这两个键(如果它们位于 config/application.rb 中)

    config.filter_parameters += [:password]
    

    【讨论】:

      【解决方案3】:

      如果您在 Rails 控制器方法中,为什么不直接调用 request.filtered_parameters

      使用已经提供的内容总是一个不错的选择。干杯!

      【讨论】:

      • 这其实应该是正确答案,谢谢:)
      • @MohamedSami 这将如何工作?从控制器方法调用 request.filtered_parameters.delete :fat_param 似乎并没有停止 :fat_param 被记录?
      • 谢谢,如果我记得我为什么写这个,我就不知道了?但我认为可以肯定的是,它以某种方式帮助了我,谢谢您的评论
      【解决方案4】:

      tadman 回答正确,但这里有一些附加信息:

      在 application.rb 中

      config.filter_parameters += [:password, :password_confirmation, :credit_card]
      

      无论您在哪里进行自定义日志记录:

      f = ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters)
      f.filter :order => {:credit_card => "4111111111111111"}
      
       => {:order=>{:credit_card=>"[FILTERED]"}} 
      

      【讨论】:

      • 它可以工作,但在 Rails 应用程序中推荐的方法是使用 filter_parameters 方法创建一个初始化文件。
      【解决方案5】:

      您始终可以使用except 方法:

      params.except(:password, :password_confirmation, :credit_card)
      

      这会将他们从列表中排除。要“过滤”它们,您可以try this approach

      【讨论】: