如何过滤rails中的参数?
Posted
技术标签:
【中文标题】如何过滤rails中的参数?【英文标题】:How to filter parameters in rails? 【发布时间】:2011-11-06 03:33:53 【问题描述】:Rails 内置了日志过滤功能,因此您无需记录密码和信用卡。效果很好,但是当您想要触发自定义日志(例如发送电子邮件)并发送您自己的参数或其他数据时,这些参数显然不会自动过滤。我一直在挖掘并试图在 rails 源中找到它,但到目前为止还没有运气。
我已将 rails 配置为过滤参数,如下所示,它可以正常工作以将数据保留在 rails 日志之外:
config.filter_parameters += [:password, :password_confirmation, :credit_card]
在将敏感数据转储到电子邮件、API 调用或自定义(非 Rails)日志之前,您将如何从 params 哈希中过滤敏感数据?
【问题讨论】:
【参考方案1】:Rails 4+
在 Rails 4+ 中过滤日志的旁注:config.filter_parameters
已从 application.rb 移至它自己的初始化程序。
config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password]
【讨论】:
记录在这里:guides.rubyonrails.org/…【参考方案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。
【讨论】:
以上是关于如何过滤rails中的参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Rails 应用程序中的一系列电子邮件中过滤掉不活动的电子邮件?