Glossaire

Où les réglages par défaut de la censure des PII en relecture de session exposent vos données

Taras Shynkarenko
Taras Shynkarenko
•Mis à jour : •11 min de lecture
Où les réglages par défaut de la censure des PII en relecture de session exposent vos donnéesOù les réglages par défaut de la censure des PII en relecture de session exposent vos données

TL;DR, Réponse rapide

11 min de lecture

La censure des PII en relecture de session se produit dans le navigateur, avant que l'enregistreur ne sérialise le DOM, et chaque bibliothèque livre un réglage par défaut différent. rrweb seul ne masque rien d'autre que les champs de mot de passe. Sentry masque tout le texte et bloque tous les médias. Microsoft Clarity masque les nombres et les adresses e-mail dans son mode Balanced par défaut. Le texte masqué laisse encore fuiter la longueur des caractères dans rrweb, Sentry et FullStory, et aucun fournisseur ne peut appliquer une nouvelle règle de masquage aux enregistrements déjà présents sur ses serveurs.

Qu'est-ce que la censure des PII en relecture de session ?

L'essentiel de la censure des PII en relecture de session, c'est qu'elle se produit dans le navigateur du visiteur, avant que l'enregistreur ne sérialise le DOM et n'envoie quoi que ce soit sur le réseau, et c'est pourquoi une règle ajoutée aujourd'hui ne change rien à un enregistrement capturé hier. Un script de relecture ne filme pas l'écran. Il parcourt le DOM, sérialise chaque noeud et diffuse les mutations, si bien que censurer revient à décider quels noeuds transmettent des valeurs réelles, lesquels transmettent des caractères de substitution et lesquels sont abandonnés puis rejoués comme une boîte vide.

Trois verbes couvrent les résultats possibles, sous des noms différents dans chaque bibliothèque. Bloquer abandonne l'élément et rejoue un substitut aux mêmes dimensions. Masquer conserve l'élément et remplace son texte. Ignorer garde l'élément visible mais cesse d'enregistrer ce que l'utilisateur a saisi. Mal choisir entre masquer et bloquer est l'erreur la plus fréquente, car les éléments masqués portent encore des données d'interaction et portent encore la longueur.

Le cadre de conformité, rétention et consentement compris, se trouve dans le guide du masquage de confidentialité de la relecture de session. Cette page couvre la mécanique en dessous : noms exacts des options, réglages par défaut livrés et endroits où ils fuient.

Trois verbes, un nœud du DOM
BloquerSupprime l'élément et rejoue un espace réservé aux mêmes dimensions
MasquerConserve l'élément, remplace son texte, révèle toujours la longueur et les données d'interaction
IgnorerGarde l'élément visible, arrête d'enregistrer ce que l'utilisateur a saisi
Chaque bibliothèque d'enregistrement nomme ces trois résultats différemment, mais le choix entre eux reste le même.

Quelles options de rrweb contrôlent ce qui est enregistré ?

rrweb, l'enregistreur open source derrière une longue liste de produits de relecture commerciaux, expose ces options de confidentialité sur rrweb.record() avec ces valeurs par défaut documentées.

OptionValeur par défautRôle
blockClass'rr-block'L'élément n'est pas enregistré et est rejoué comme un substitut aux mêmes dimensions
blockSelectornullIdentique à blockClass mais avec une correspondance par sélecteur CSS
ignoreClass'rr-ignore'L'élément s'affiche normalement mais ses événements de saisie ne sont pas enregistrés
ignoreSelectornullIdentique à ignoreClass mais avec une correspondance par sélecteur CSS
maskTextClass'rr-mask'Tout le texte de l'élément et de ses enfants est masqué
maskTextSelectornullIdentique à maskTextClass mais avec une correspondance par sélecteur CSS
maskAllInputsfalseMasque le contenu de chaque champ de saisie par *
maskInputOptions{ password: true }Masque des types de saisie précis
maskInputFnaucuneRemplace la logique de masquage des saisies par défaut
maskTextFnaucuneRemplace la logique de masquage du texte par défaut

Le guide de rrweb énonce le réglage livré en une ligne : input[type="password"] will be masked by default.

Ce que la liste ne contient pas, c'est une option de démasquage. Les options d'enregistrement de rrweb ne comportent ni unmaskTextClass ni unblockSelector, donc un masque posé sur un conteneur ne peut pas être levé sur un seul enfant à l'intérieur. Les fournisseurs qui proposent le démasquage, dont Sentry et FullStory, ont construit cette couche eux-mêmes.

Gros plan sur des mains tapant sur un clavier, à l'image d'une saisie de mot de passe que rrweb masque par défaut.

Que masque rrweb par défaut ?

Tel quel, rrweb masque exactement une chose : la valeur de input[type="password"]. Le texte et tous les autres types de saisie sont enregistrés mot pour mot, si bien que les champs e-mail, nom, adresse, numéro de carte et texte libre quittent le navigateur avec leur contenu réel tant que vous ne les configurez pas autrement.

Deux détails du code source de rrweb transforment ce réglage en piège. Le premier est que maskInputOptions remplace la valeur par défaut au lieu de fusionner avec elle. Passez maskInputOptions: { email: true } parce que vous voulez couvrir les e-mails et vous avez désactivé en silence le masquage des mots de passe. La forme sûre écrit { password: true, email: true } à chaque fois.

Le second est la forme du type MaskInputOptions. Il accepte color, date, datetime-local, email, month, number, range, search, tel, text, time, url, week, textarea, select et password, et il n'accepte ni checkbox, ni radio, ni file. Régler maskAllInputs: true se déploie sur chaque clé de cette liste, donc même le réglage maximal de masquage des saisies enregistre quelles cases à cocher et quels boutons radio un visiteur a sélectionnés. Sur un formulaire d'admission médicale, la case à cocher est la donnée sensible. FullStory règle cela en excluant plutôt qu'en masquant : sa fonction Form Privacy "masks all form elements with the attributes input, textarea, select, and contenteditable, and exclude all form elements with the attributes radio and checkbox."

En quoi les fournisseurs de relecture de session diffèrent-ils sur les réglages de masquage ?

Les fournisseurs se placent aux extrémités opposées de la même boîte à outils, et le réglage par défaut décide du coût d'une règle oubliée.

OutilMasqué sans configurationMécanisme de retrait
rrwebUniquement input[type="password"]Aucun ; il n'existe pas d'option de démasquage
PostHogToutes les saisies (maskAllInputs vaut true par défaut) ; le texte n'est pas masquéClasse ph-no-capture
SentryTout le texte (maskAllText: true), toutes les saisies, tous les médias (blockAllMedia: true).sentry-unmask, .sentry-unblock, aucune appliquée par défaut
Microsoft ClarityNombres et adresses e-mail dans le mode Balanced par défaut ; saisies et listes déroulantes dans tous les modesdata-clarity-unmask="true"
FullStory avec Private by DefaultChaque élément, capturé masqué.fs-unmask
LogRocketRien ; inputSanitizer et textSanitizer valent false par défautdata-public

Sentry énonce sa position sans détour : "by default, the Session Replay SDK will mask all text content with * and block all media elements." Clarity propose le compromis inverse via trois modes, où Strict masque "the entire content", Balanced masque "numbers and email addresses" et Relaxed ne masque rien au-delà des saisies et des listes déroulantes. Deux comportements de Clarity ne sont pas configurables du tout : "Content in the input boxes is masked in all modes and can't be customized" et "The drop-down menus are also masked in all modes." Clarity signale ce qu'il a caché par ▫ pour un chiffre, ▪ pour une lettre et • pour le mode Strict.

Pourquoi le texte masqué laisse-t-il encore fuiter de l'information ?

Le texte masqué laisse fuiter la longueur de ce qu'il a remplacé, parce que les enregistreurs les plus déployés substituent un caractère de remplacement par caractère d'origine. La fonction de masquage de rrweb s'écrit littéralement text = '*'.repeat(text.length). La fonction de masque par défaut de Sentry est (s) => '*'.repeat(s.length). FullStory est explicite : "This placeholder text blob will retain the size, color, and character length of the original text."

La documentation de FullStory rend le risque concret pour un champ comme le solde d'un compte : "if you were comparing the session replays of 2 different accounts, and one showed a placeholder string for account balance that was three inches long and the other had a placeholder string that was half an inch long, you now know more about these two accounts than you probably need to."

La longueur n'est pas le seul canal. Les éléments masqués enregistrent encore les interactions, et c'est pourquoi FullStory dit à ses clients du secteur de la santé d'exclure à la place : "Because masked elements collect interaction data, it would be possible for someone with good working knowledge of the product to understand which health issues a user was checking the boxes for."

Flowsery
Flowsery

Commencez votre essai gratuit de 14 jours

Tableau de bord en temps réel

Suivi des objectifs

Suivi sans cookies

Le correctif est le même dans les deux cas. Renvoyez une chaîne de longueur fixe depuis une maskTextFn ou une maskInputFn personnalisée au lieu d'une chaîne calculée caractère par caractère, et faites passer tout ce qui permet une inférence du masquage au blocage. L'écart entre réduire l'identifiabilité et la supprimer, c'est la différence entre pseudonymisation et anonymisation.

Qu'est-ce qui échappe aux règles de masquage ?

Les règles de masquage s'appliquent aux noeuds de texte du DOM et aux valeurs de saisie, donc tout ce qui porte des données en dehors de ces deux endroits reste dans l'enregistrement. Chaque fournisseur documente son propre angle mort.

  • Feuilles de style. Clarity "doesn't mask content within style sheets or style tags. Hence, it is recommended not to host sensitive content within CSS."
  • SVG en ligne. Hotjar : "SVGs linked as the source for image elements can be suppressed, but inline SVGs cannot."
  • Images sur le web. FullStory : "Images cannot be masked when capturing data on web sessions. If you wish to hide images from data capture, use .fs-exclude."
  • URL et charges utiles réseau. Une page masquée dont la chaîne de requête contient un numéro de compte l'expédie quand même. PostHog expose maskCapturedNetworkRequestFn ; FullStory place les corps de requête et de réponse sur liste d'autorisation.
  • Propriétés d'événements personnalisés. La censure régit le flux de relecture, pas les événements analytiques que votre propre code envoie.

Rangées de baies de serveurs dans un centre de données, représentant les enregistrements déjà stockés que les règles de masquage ne peuvent pas atteindre rétroactivement.

Le masquage peut-il s'appliquer aux enregistrements que vous avez déjà ?

Aucun fournisseur ne peut censurer rétroactivement une session qui a déjà atteint ses serveurs, et deux le disent noir sur blanc. Clarity : "Changes to masking settings affect new recordings and could take up to one hour to be reflected. Masking changes can't be applied retroactively." Hotjar : "After a session is sent, there is no way to retrieve or suppress data, and updating suppression settings will not apply the updated settings retroactively."

Le chiffre d'une heure est la partie que les équipes manquent. Ajouter une règle après avoir repéré des numéros de carte dans une relecture laisse jusqu'à une heure d'enregistrements supplémentaires les capturer, en plus de tout ce qui est déjà stocké. Les remèdes sont de supprimer les enregistrements concernés et de raccourcir la rétention, ce qui fait de la durée de rétention un contrôle de censure plutôt qu'un réglage de stockage. C'est aussi pourquoi les plaignants dans les procès pour écoute illégale liés à la relecture de session débattent de ce qui a été capturé plutôt que de ce qui a ensuite été caché dans l'interface de relecture.

Faut-il tout masquer puis démasquer, ou l'inverse ?

Masquez tout par défaut et démasquez ce que vous avez vérifié, parce que le mode de défaillance d'une liste de blocage est de capturer des données que vous n'avez jamais voulues et celui d'une liste d'autorisation est une relecture ennuyeuse. FullStory a bâti Private by Default sur ce raisonnement : "no text is captured or sent outside the user's browser unless it is explicitly allowlisted as safe to capture", de sorte que "you won't accidentally capture unwanted data even if you fail to set specific data capture rules."

Réglez la question de la priorité avant d'écrire le premier sélecteur. FullStory tranche les conflits en faveur de la confidentialité : "if an element matches both a masking rule and an unmasking rule, it would be masked rather than unmasked, as the stricter rule will always apply." Clarity fait l'inverse pour les attributs : data-clarity-unmask="true" démasque un noeud et ses enfants et "overrides anything set on the Clarity website." Deux produits, deux réponses opposées.

Gardez les règles dans le code plutôt que dans un tableau de bord. FullStory qualifie l'approche par le code de "a less brittle and more future-proof approach than handling these rules through the UI using CSS selectors", parce qu'un sélecteur écrit dans un écran de réglages casse en silence quand une bibliothèque de composants livre de nouveaux noms de classes.

Flowsery fonctionne sans cookies et enregistre les sessions sans échantillonnage. Si vous en êtes encore à décider ce que la relecture capture, commencez par ce qu'est la relecture de session, puis fixez la politique de masquage avant que la première balise de script ne passe en production.

Questions fréquentes

Le masquage en relecture de session intervient-il avant ou après l'envoi des données ?

Avant, dans tous les produits documentés ici. Clarity "never captures anything that is masked or sent over the wire", et Hotjar décrit la suppression comme le retrait des données personnelles "before sending a session from your website's Document Object Model (DOM) to Hotjar". Un masquage appliqué au moment de la lecture est un filtre d'affichage, pas une censure.

maskAllInputs: true couvre-t-il tous les champs de formulaire dans rrweb ?

Non. Il se déploie sur chaque clé du type MaskInputOptions de rrweb, qui omet checkbox, radio et file, donc l'état des cases à cocher et des boutons radio continue d'être enregistré. Bloquez plutôt ces éléments, comme le fait Form Privacy de FullStory.

Puis-je démasquer un champ à l'intérieur d'un conteneur masqué ?

Cela dépend du produit, et rrweb seul ne le peut pas. Les options d'enregistrement de rrweb ne comportent aucune classe ni aucun sélecteur de démasquage, donc un masque posé sur un parent couvre chaque enfant. FullStory et Sentry ajoutent le démasquage par-dessus, Sentry livrant .sentry-unmask et .sentry-unblock appliqués à rien par défaut.

Quelle est la différence entre masquer et bloquer un élément ?

Masquer conserve l'élément et remplace son texte ; bloquer retire l'élément et rejoue un substitut. FullStory trace la ligne selon le risque d'inférence et recommande l'exclusion pour les données réglementées, pour les identifiants comme les numéros de compte bancaire et pour tout élément où la seule interaction révèle quelque chose de personnel.

Les enregistrements masqués comptent-ils encore comme des données personnelles ?

Traitez-les comme des données personnelles tant que vous n'avez pas prouvé le contraire. Un masquage qui préserve la longueur des caractères, les coordonnées de clic et la structure des éléments réduit l'identifiabilité sans la supprimer, ce qui relève de la pseudonymisation et non de l'anonymisation, et les données pseudonymisées restent dans le champ du RGPD.

Combien de temps une règle de masquage ajoutée met-elle à prendre effet ?

Sur Clarity le chiffre documenté est d'une heure au maximum, et uniquement pour les nouveaux enregistrements. Les règles côté client dans rrweb, Sentry, PostHog et LogRocket prennent effet au prochain chargement de page servant le script mis à jour, donc un bundle en cache ou un TTL CDN long allonge la fenêtre pendant laquelle les anciennes règles s'appliquent encore.

Flowsery
Flowsery

Commencez votre essai gratuit de 14 jours

Tableau de bord en temps réel

Suivi des objectifs

Suivi sans cookies

Quel outil de relecture de session masque le plus par défaut ?

Sentry applique le réglage par défaut le plus strict parmi les outils traités ici : il masque tout le texte (maskAllText: true), masque chaque champ de saisie et bloque tous les médias (blockAllMedia: true). rrweb se situe à l'autre extrémité, ne masquant par défaut que input[type="password"] tant qu'on ne configure rien d'autre. Choisir un fournisseur sans vérifier ces réglages par défaut revient à décider de ce qui reste exposé avant même d'écrire une seule règle.

PostHog masque-t-il le texte par défaut ?

PostHog ne masque pas le texte par défaut. Il masque tous les champs de saisie, puisque maskAllInputs vaut true par défaut, mais les nœuds de texte sont enregistrés tels quels sans règle supplémentaire. La classe ph-no-capture permet de retirer certains éléments de l'enregistrement, remplacés par un bloc de même taille.

Peut-on masquer les SVG en ligne ou les feuilles de style en relecture de session ?

Les règles de masquage s'appliquent aux nœuds de texte du DOM et aux valeurs des champs de saisie, donc tout ce qui sort de ces deux endroits leur échappe. Clarity ne masque pas le contenu des feuilles de style ni des balises style, ce qui explique sa recommandation de ne pas héberger de contenu sensible en CSS. Hotjar précise que les SVG utilisés comme source d'image peuvent être supprimés, mais que les SVG en ligne ne le peuvent pas.

Les règles de masquage doivent-elles vivre dans le code ou dans un tableau de bord ?

Mieux vaut les garder dans le code. FullStory qualifie l'approche code d'abord de moins fragile que la gestion des règles via l'interface avec des sélecteurs CSS, car un sélecteur défini dans un écran de configuration casse silencieusement dès qu'une bibliothèque de composants change ses noms de classes. Versionner les règles avec l'application permet de livrer et d'annuler un changement comme n'importe quel autre code.

Cet article vous a-t-il été utile ?

Dites-nous ce que vous en pensez !

Nous voir plus souvent sur Google

Un clic définit Flowsery comme source préférée. Nos articles remontent alors dans vos À la une, en mode IA et dans les aperçus IA.

Avant de partir...

Flowsery

Flowsery

Des analyses orientées revenus pour votre site web

Suivez chaque visiteur, source et conversion en temps réel. Simple, puissant et sans cookies.

Tableau de bord en temps réel

Suivi des objectifs

Suivi sans cookies

Termes connexes du glossaire

Comment fonctionne le session replay et ce qu'il ne voit pasComment fonctionne le session replay et ce qu'il ne voit pas
Glossaire

Comment fonctionne le session replay et ce qu'il ne voit pas

Le session replay reconstruit une visite à partir des mutations du DOM et des saisies, pas d'une vidéo. Ce qu'il capture, ce que le masquage cache, ses limites.

•9 min de lecture
De combien le session replay ralentit-il la vitesse d'un site ?De combien le session replay ralentit-il la vitesse d'un site ?
Glossaire

De combien le session replay ralentit-il la vitesse d'un site ?

La vraie réponse au ralentissement causé par le session replay, avec les chiffres publiés de rrweb et Sentry sur le script, le CPU et l'upload.

•9 min de lecture
Ce qui distingue vraiment rage clicks vs dead clicksCe qui distingue vraiment rage clicks vs dead clicks
Glossaire

Ce qui distingue vraiment rage clicks vs dead clicks

La différence rage clicks vs dead clicks porte sur la cause, pas la gravité. Seuils de détection publiés par PostHog, Hotjar, FullStory, LogRocket et Clarity.

•9 min de lecture
Comment les cookies partitionnés CHIPS donnent à chaque site son propre potComment les cookies partitionnés CHIPS donnent à chaque site son propre pot
Glossaire

Comment les cookies partitionnés CHIPS donnent à chaque site son propre pot

Poser des cookies partitionnés CHIPS exige Secure, SameSite=None et un attribut de plus, et le navigateur garde une copie par site de premier niveau.

•10 min de lecture
Ce qu'un procès pour écoutes lié au session replay doit prouver au tribunalCe qu'un procès pour écoutes lié au session replay doit prouver au tribunal
Glossaire

Ce qu'un procès pour écoutes lié au session replay doit prouver au tribunal

Tout procès pour écoutes lié au session replay repose sur CIPA 631, la WESCA ou le Wiretap Act. Ce qu'allèguent les plaignants, ce qu'ont jugé les juges.

•10 min de lecture
Ce que la digital experience analytics couvre et que le web analytics manqueCe que la digital experience analytics couvre et que le web analytics manque
Glossaire

Ce que la digital experience analytics couvre et que le web analytics manque

Plutôt que compter des événements, la digital experience analytics reconstruit la visite : session replay, heatmaps, friction et analyse de parcours.

•8 min de lecture

Articles connexes