web-dev-qa-db-fra.com

Comment filtrer les paramètres dans les rails?

Rails a intégré un filtrage des journaux afin que vous ne connectiez pas les mots de passe et les cartes de crédit. Fonctionne très bien pour cela, mais lorsque vous souhaitez déclencher un journal personnalisé (comme envoyer un e-mail) et envoyer vos propres paramètres ou d'autres données avec eux, les paramètres ne sont évidemment pas filtrés automatiquement. J'ai creusé et essayé de trouver cela dans la source Rails mais je n'ai pas eu de chance jusqu'à présent.

J'ai configuré Rails pour filtrer les paramètres comme suit et cela fonctionne correctement pour garder les données hors des journaux Rails:

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

Comment filtreriez-vous les données sensibles du hachage des paramètres avant de les transférer dans un e-mail, un appel API ou un journal personnalisé (non Rails)?

42
chrishomer

Vous pouvez toujours utiliser la méthode except:

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

Cela les exclura de la liste. Pour les "filtrer", vous pouvez essayez cette approche .

34
tadman

Rails 4+

Sidenote pour filtrer la connexion Rails 4+: le config.filter_parameters a été déplacé de application.rb vers son propre initialiseur.

config/initializers/filter_parameter_logging.rb

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

tadman a répondu correctement mais voici quelques informations supplémentaires:

Dans application.rb

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

Où que vous effectuiez une journalisation personnalisée:

f = ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters)
f.filter :order => {:credit_card => "4111111111111111"}

 => {:order=>{:credit_card=>"[FILTERED]"}} 
47
chrishomer

Si vous êtes dans une méthode de contrôleur Rails, pourquoi ne pas simplement appeler request.filtered_parameters?

C'est toujours un bon choix d'utiliser ce qui est déjà fourni. À votre santé!

17
Lester Celestial

Juste pour ajouter la réponse @tadman:

Lorsque vous utilisez except , sachez que cela supprimera uniquement les clés de niveau supérieur de vos paramètres, par exemple:

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

En utilisant request.filtered_parameters filtrera ces deux clés si elles se trouvent dans config/application.rb

config.filter_parameters += [:password]
4