Подтвердить что ты не робот

Как фильтровать параметры в рельсах?

Rails имеет встроенную фильтрацию журналов, поэтому вы не регистрируете пароли и кредитные карты. Отлично подходит для этого, но когда вы хотите запустить собственный журнал (например, по электронной почте) и отправлять вместе с ним свои собственные параметры или другие данные, параметры, очевидно, не автофильтруются. Я копаю и пытаюсь найти это в источнике рельсов, но до сих пор не повезло.

Я сконфигурировал рельсы для фильтрации параметров следующим образом, и он работает правильно для хранения данных из журналов рельсов:

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

Как вы отфильтровываете конфиденциальные данные из хэша params перед тем, как сбросить его в адрес электронной почты, api или пользовательский (не-rails) журнал?

4b9b3361

Ответ 1

Вы всегда можете использовать метод except:

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

Это исключает их из списка. Чтобы "фильтровать" их, вы могли бы попробовать этот подход.

Ответ 2

Rails 4 +

Sidenote для фильтрации журнала в Rails 4+: config.filter_parameters был перенесен из application.rb в собственный инициализатор.

конфигурации/инициализаторы/filter_parameter_logging.rb

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

Ответ 3

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]"}} 

Ответ 4

Если вы находитесь внутри метода контроллера рельсов, почему бы просто не вызвать request.filtered_parameters?

Всегда полезно использовать то, что уже предусмотрено. Ура!

Ответ 5

Просто добавьте ответ @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]