Question Comment filtrer les paramètres dans les rails?


Rails a intégré le filtrage des journaux pour ne pas enregistrer 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 courrier électronique) et envoyer vos propres paramètres ou autres données, les paramètres ne sont évidemment pas filtrés automatiquement. J'ai creusé et essayé de trouver ceci dans la source de rails mais n'ai eu aucune chance jusqu'ici.

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

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

Comment filtreriez-vous les données sensibles du hachage de params avant de les transférer dans un courrier électronique, un appel api ou un journal personnalisé (non-rails)?


37
2017-08-29 15:56


origine


Réponses:


Vous pouvez toujours utiliser le except méthode:

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

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


29
2017-08-29 16:25



Rails 4+

Sidenote pour filtrer le journal dans Rails 4+: The 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]

48
2018-02-24 11:59



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

40
2017-08-29 22:56



Si vous êtes dans une méthode de contrôleur de 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é!


14
2017-07-17 12:45



Juste pour ajouter sur @tadman répondre:

En utilisant exceptAttention, il ne supprimera que les clés de premier niveau 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]

2
2018-05-30 15:52