Masquage des données sensibles

QuietGuard\Monitor\Support\Scrubber masque les valeurs sensibles par clé avant que quoi que ce soit ne quitte le processus. Il est agnostique vis-à-vis du framework et opère uniquement sur des tableaux.

Configurer les clés

Passez les termes à masquer au constructeur. Ils sont stockés en minuscules, et une clé correspond dès que son nom contient l'un d'eux, sans tenir compte de la casse :

php
use QuietGuard\Monitor\Support\Scrubber;

$scrubber = new Scrubber(['password', 'authorization', 'api_key', 'secret']);

Fonctionnement

scrub(array $data): array parcourt le tableau récursivement. Quand une clé (de type chaîne) contient l'un des termes configurés, toute sa valeur est remplacée par la constante de masque ; sinon les tableaux imbriqués sont masqués à leur tour.

php
$clean = $scrubber->scrub([
    'user_id'  => 42,
    'password' => 'hunter2',
    'headers'  => [
        'Authorization' => 'Bearer abc',
        'Accept'        => 'application/json',
    ],
]);

// [
//   'user_id'  => 42,
//   'password' => '[scrubbed]',
//   'headers'  => [
//       'Authorization' => '[scrubbed]',   // comparaison insensible à la casse
//       'Accept'        => 'application/json',
//   ],
// ]

Remarques sur le comportement :

  • Le masque est la constante publique Scrubber::MASK, qui vaut '[scrubbed]'.
  • La comparaison porte sur le nom de la clé, pas sur la valeur: le scrubber ne recherche pas de motifs de secrets à l'intérieur des chaînes.
  • La comparaison est une recherche de sous-chaîne insensible à la casse : il suffit que le nom de la clé contienne un terme configuré, si bien qu'un password configuré masque aussi user_password et PASSWORD_CONFIRMATION.
  • Une clé qui correspond voit toute sa valeur masquée, qu'il s'agisse d'un scalaire ou d'un tableau imbriqué.
  • Les clés numériques / de liste ne sont jamais considérées comme sensibles ; seules les clés de type chaîne sont comparées.

Où il est appliqué

Le Reporter exécute le scrubber automatiquement :

  • reportException() masque le contexte de l'exception avant l'envoi.
  • sendLogs() masque le tableau de logs avant l'envoi.
  • sendDependencies() ne masque pas: un manifeste de dépendances contient des noms et versions de packages, pas des secrets.

Si vous construisez les payloads vous-même, appelez scrub() sur le tableau concerné avant de le confier à un transport.

L'autre moitié : le masquage par forme

Un nom de clé ne voit jamais une adresse écrite dans le texte libre d'un message d'erreur, dans un segment d'URL ou dans un champ que quelqu'un a appelé reference. Support\ValueRedactor lit la valeur, et le Reporter l'applique à tout le payload en dernier avant l'envoi, exceptions comme logs.

Il est actif par défaut, avec email, iban, nir, card et phone. Les formes porteuses d'une clé de contrôle sont vérifiées et pas seulement reconnues, si bien qu'une référence de commande à seize chiffres n'est pas prise pour un numéro de carte, et chaque masque nomme ce qu'il a caché ([redacted:email]) pour que le message reste lisible. Il se configure par Config : redact choisit les formes, customRedactions ajoute les vôtres.

Vous lisez la documentation PHP Core v1.0.