Parameters: {"user"=>{"name"=>"susan", "password_confirmation"=>"[FILTERED]", "password"=>"[FILTERED]"}, "commit"=>"Register", "action"=>"create", "authenticity_token"=>"9efc03bcc37191d8a6dc3676e2e7890ecdfda0b5", "controller"=>"users"}
在应用程序的日志中,通常会记录请求的参数,以便开发人员进行调试和排查问题。然而,在某些情况下,这些参数中可能包含了敏感信息,如用户密码等,我们不希望这些敏感信息被明文记录在日志中。幸运的是,Rails 提供了一种简单的方法来隐藏这些敏感参数值,使其显示为[FILTERED]
,以增加安全性。
首先,让我们看一下如何配置 Rails 来隐藏敏感参数值。在 Rails 中,你可以在控制器中使用filter_parameter_logging
方法或者在初始化文件中使用Rails.application.config.filter_parameters
来指定需要隐藏的参数。以下是两种常见的配置方式:
1. 在控制器中配置:
class UsersController < ApplicationController
before_action :filter_sensitive_parameters, only: [:create]
def create
# ...
end
private
def filter_sensitive_parameters
filter_parameter_logging :password, :password_confirmation
end
end
在上面的示例中,我们在UsersController
中使用before_action
来调用filter_sensitive_parameters
方法,该方法使用filter_parameter_logging
来指定需要隐藏的参数。
2. 在初始化文件中配置:
# config/application.rb
Rails.application.config.filter_parameters += [:password, :password_confirmation]
这种方式会全局应用于整个应用程序,无需在每个控制器中单独配置。
接下来,让我们深入了解 Rails 是如何实现参数值隐藏的。
Rails 使用了一个名为ActiveSupport::ParameterFilter
的模块来处理参数值的隐藏。这个模块定义了一个filter_param
方法,该方法接收参数的名称和值,然后返回隐藏后的值。
module ActiveSupport
module ParameterFilter
extend self
def filter_param(key, value)
# 判断参数是否需要被隐藏
if parameter_filtered?(key)
"[FILTERED]"
else
value
end
end
def parameter_filtered?(key)
# 检查参数是否包含在配置中
Rails.application.config.filter_parameters.include?(key.to_sym)
end
end
end
在上面的代码中,filter_param
方法首先检查参数是否包含在配置中。如果参数需要被隐藏,它会返回"[FILTERED]"
,否则返回原始值。parameter_filtered?
方法用于检查参数是否需要被隐藏。
当请求到达控制器时,Rails 会自动调用filter_param
方法,将参数的名称和值传递给它,然后将隐藏后的值记录在日志中。
总结一下,隐藏敏感参数值的方法及实现原理如下:
-
在 Rails 中,可以通过控制器中的
filter_parameter_logging
方法或全局配置Rails.application.config.filter_parameters
来指定需要隐藏的参数。 -
参数值的隐藏是通过
ActiveSupport::ParameterFilter
模块来实现的,该模块定义了filter_param
方法,根据配置决定是否隐藏参数值。 -
当请求到达控制器时,Rails 会自动调用
filter_param
方法,将参数的名称和值传递给它,然后将隐藏后的值记录在日志中,以增加应用程序的安全性。