Ответ 1
Вы всегда можете использовать метод except
:
params.except(:password, :password_confirmation, :credit_card)
Это исключает их из списка. Чтобы "фильтровать" их, вы могли бы попробовать этот подход.
Rails имеет встроенную фильтрацию журналов, поэтому вы не регистрируете пароли и кредитные карты. Отлично подходит для этого, но когда вы хотите запустить собственный журнал (например, по электронной почте) и отправлять вместе с ним свои собственные параметры или другие данные, параметры, очевидно, не автофильтруются. Я копаю и пытаюсь найти это в источнике рельсов, но до сих пор не повезло.
Я сконфигурировал рельсы для фильтрации параметров следующим образом, и он работает правильно для хранения данных из журналов рельсов:
config.filter_parameters += [:password, :password_confirmation, :credit_card]
Как вы отфильтровываете конфиденциальные данные из хэша params перед тем, как сбросить его в адрес электронной почты, api или пользовательский (не-rails) журнал?
Вы всегда можете использовать метод except
:
params.except(:password, :password_confirmation, :credit_card)
Это исключает их из списка. Чтобы "фильтровать" их, вы могли бы попробовать этот подход.
Sidenote для фильтрации журнала в Rails 4+: config.filter_parameters
был перенесен из application.rb в собственный инициализатор.
конфигурации/инициализаторы/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password]
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]"}}
Если вы находитесь внутри метода контроллера рельсов, почему бы просто не вызвать request.filtered_parameters
?
Всегда полезно использовать то, что уже предусмотрено. Ура!
Просто добавьте ответ @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]