En ce qui concerne le masque de journal de requête, [ce code](https://qiita.com/calorie/items/426fb4c23ab850122f93#activerecordlogsubscriber%E3%81%AB%E3%83%91%E3%83%83%E3%83%81 Patch ʻActiveRecord :: LogSubscriber` avec% E3% 82% 92% E3% 81% 82% E3% 81% A6% E3% 82% 8B)
Il s'agit de remplacer les informations confidentielles telles que les informations personnelles sur le journal par une chaîne de caractères spécifique pour les masquer. Le masquage est important car il réduit le risque de fuite d'informations sensibles.
Le masque de journal dans Rails est config.filter_parameters
.
Il s'agit d'une fonction pratique qui masque les paramètres du journal des requêtes en spécifiant les paramètres que vous souhaitez masquer.
Cependant, comme mentionné dans ce problème, le masquage du journal des requêtes n'est pas couvert. De plus, Rails utilise par défaut la production mais le niveau de journalisation est le débogage, donc Même en production, le journal des requêtes circulera et des informations confidentielles seront exposées.
Rails 6 a publié filter_attribute
pour éviter le problème d'être inspecté et d'exposer des informations sensibles aux journaux.
Cependant, je ne pouvais pas non plus masquer le journal des requêtes ici.
(Il peut être possible de masquer en fonction de la façon dont Active Record est implémenté)
Voici quelques solutions pour le masquage du journal des requêtes.
En premier lieu, si vous définissez config.log_level =: info
pour empêcher la sortie du journal des requêtes, le problème sera résolu.
Toutefois, vous ne souhaiterez peut-être pas utiliser cette méthode si possible car vous ne pourrez pas voir tous les journaux de requête.
Il existe un joyau appelé blouson, qui est un excellent joyau qui a la capacité de masquer le journal des requêtes pour une table particulière.
Cependant, le préfixe du nom de la table que vous souhaitez masquer doit être secure_
, et il masquera tout le journal des requêtes capturé dans la condition.
Par conséquent, il est un peu difficile à utiliser dans mon environnement, et je voulais masquer uniquement des colonnes spécifiques comme filter_parameters
.
Je pense que c'est la solution la plus proche du comportement de filter_attribute
.
Comme indiqué ci-dessous, dans la partie qui génère le journal de ʻActiveRecord :: LogSubscriber`, Pour les journaux de requête qui lient les colonnes avec une chaîne spécifique, essayez de masquer la valeur liée.
Ajoutez un traitement de masque avant render_bind
par la méthode présentée dans ici.
config/initializers/sql_log_filter.rb
module SqlLogFilter
FILTERS = Set.new(%w(email password))
def render_bind(attr, value)
value = '[FILTERED]' if FILTERS.include?(attr.name)
super(attr, value)
end
end
ActiveRecord::LogSubscriber.prepend SqlLogFilter
Puisque les paramètres sont directement incorporés dans le journal SQL, la partie appropriée est omise par une expression régulière et remplacée.
config/initializers/sql_log_filter.rb
module SqlLogFilter
FILTER_REGEX = /email|password/i
def sql(event)
binds = event.payload[:binds]
return super(event) if binds.blank?
binds.each_with_index do |bind, index|
next unless bind.name.match?(FILTER_REGEX)
event.payload[:sql] = event.payload[:sql].gsub(/@#{index} = (N?'(.*?)'|\d+)/) do |_|
"@#{index} = [FILTERED]"
end
end
super(event)
end
end
ActiveRecord::LogSubscriber.prepend SqlLogFilter
Bonne vie de masque!
Recommended Posts