隐藏敏感参数值的方法及实现原理

  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方法,将参数的名称和值传递给它,然后将隐藏后的值记录在日志中。

总结一下,隐藏敏感参数值的方法及实现原理如下:

  1. 在 Rails 中,可以通过控制器中的filter_parameter_logging方法或全局配置Rails.application.config.filter_parameters来指定需要隐藏的参数。

  2. 参数值的隐藏是通过ActiveSupport::ParameterFilter模块来实现的,该模块定义了filter_param方法,根据配置决定是否隐藏参数值。

  3. 当请求到达控制器时,Rails 会自动调用filter_param方法,将参数的名称和值传递给它,然后将隐藏后的值记录在日志中,以增加应用程序的安全性。

你可能感兴趣的:(ruby,on,rails)