Burn-Link ·

Après avoir collé un lien à lecture unique dans un chat qui génère un aperçu, pourquoi le nombre de lectures n'est pas forcément déjà consommé

Une carte qui apparaît dans le canal ne veut pas dire que le destinataire a déjà lu le texte chiffré. Pour dessiner l'aperçu, l'outil de messagerie envoie un GET HTTP vers la page ; cette requête lit en général le titre et un extrait, ne clique pas sur « Ouvrir et afficher », et n'emporte pas la clé après #. Ci-dessous, « dessiner une carte » et « consommer une lecture » sont séparés, avec des étapes à vérifier sur place. Ce n'est pas le mode d'emploi du formulaire de création.

Comparer l'aperçu Vérifiable sur place Sans inscription
00 / Sommaire

D'abord, quelle couche la carte interroge

Cet article ne répond qu'à : « après collage dans un chat qui génère un aperçu, pourquoi le nombre de lectures n'est pas forcément déjà consommé ». Ce n'est pas la notice du lien unique, ni l'article sur « pourquoi # n'entre pas dans les journaux serveur ».

01 / Récupération

Quelle couche la carte d'aperçu interroge

La carte apparaît dans les secondes qui entourent l'envoi. La requête part des serveurs de l'outil de messagerie, pas du doigt du destinataire.

Quand vous collez une adresse du type https://…/s.html?id=…#… dans Slack, Discord, Microsoft Teams ou WhatsApp, une petite carte s'affiche souvent sous le champ de saisie ou sous le message : un titre, une phrase d'extrait, parfois une icône. Beaucoup la lisent comme « le lien a déjà été ouvert ». L'ordre est l'inverse. L'outil envoie d'abord un GET HTTP à cette adresse, extrait du HTML og:title, og:description ou un simple <title>, puis dessine la carte. Le destinataire n'a encore rien cliqué.

Slack le décrit en français et en anglais. La page d'aide Partager des liens et définir vos préférences pour les aperçus dit qu'un aperçu du contenu s'affiche sous le message, et que la plupart des URL sont « automatiquement développées ». Côté technique, Slack appelle cela le classic link unfurling dans Unfurling links in messages : quand un lien est détecté, Slack le parcourt et fournit un aperçu. Le robot qui récupère la page se nomme Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots). Sur Slack Robots, Slack écrit qu'il prend le moins possible de la page (en-têtes HTTP Range) pour extraire les balises oEmbed, Twitter Card et Open Graph. Il ne récupère une image, une vidéo ou un fichier audio que si une balise y pointe, pour en vérifier la validité. Les réponses sont mises en cache côté service pendant environ 30 minutes. La page ne dit pas que le JavaScript de la page est exécuté, ni qu'un bouton est cliqué à la place de l'utilisateur.

Quand un navigateur — ou un robot d'aperçu qui se comporte comme un navigateur — envoie ce GET, le texte après # n'entre pas dans la ligne de requête. L'IETF définit le fragment, dans RFC 3986 §3.5, comme un identifiant côté client : le serveur ne s'en sert pas pour traiter l'URI. Même si le robot recopie toute la chaîne vue dans le champ de saisie, la requête qui atteint UsePwd s'arrête en général à s.html?id={id}. Pourquoi la clé n'apparaît pas dans les journaux d'accès, c'est l'objet de Pourquoi le fragment # d'une URL n'apparaît pas dans les journaux serveur. Ici, il s'agit de la couche suivante : un GET qui n'a jamais porté la clé compte-t-il comme « une lecture ».

À retenir

La question utile n'est pas « l'outil de messagerie a-t-il vu cette URL ». C'est « ce GET a-t-il atteint l'API qui délivre le texte chiffré ». Une carte prouve seulement que le titre a été lu. Savoir si le texte chiffré est encore là se vérifie à part.

02 / Couches

Pourquoi le premier GET n'est pas une lecture

Si un outil confond « récupérer le texte chiffré » et « ouvrir la page d'atterrissage » en une seule requête, le robot d'aperçu consomme l'unique lecture. Une fois les étapes séparées, ce ne sont plus la même action.

Beaucoup de liens à usage unique accrochent le secret à exactement l'URL que le robot d'aperçu interroge en GET. Le robot demande une fois ; le serveur renvoie le corps et efface l'enregistrement. Le destinataire ouvre ensuite « déjà lu » ou une 404. Cet échec est fréquent. Slack ne « brûle » pas le secret par malveillance. L'implémentation traite un GET pouvant être mis en cache — méthode que la RFC 9110 continue de décrire comme sûre — comme l'action qui détruit le texte chiffré.

Le lien unique UsePwd sépare le travail en trois étapes. À la création, l'onglet actuel chiffre avec Web Crypto et AES-256-GCM. Texte en clair : 32 KB au plus. Les seuls champs envoyés sont le texte chiffré, une expiration et un nombre de lectures. L'expiration peut être 1 heure, 24 heures, 7 jours, ou « détruit après lecture seulement » sans TTL horaire. Les lectures vont de 1 à 10, 1 par défaut. L'URL partagée a la forme s.html?id={id}#{key}. Création et lecture s'utilisent dès l'ouverture : aucun des deux côtés ne s'inscrit. Le serveur ne stocke que le texte chiffré. Il ne voit pas le texte en clair, et il n'existe pas de compte qui permettrait de le retrouver par utilisateur.

Quand le destinataire ouvre la page de lecture, l'onglet demande d'abord à /api/secrets/{id}/status si le texte chiffré est encore là. La réponse est active, burned ou expired. Le compteur n'augmente pas, l'enregistrement reste. Ce n'est qu'après Ouvrir et afficher que le navigateur appelle /api/secrets/{id}, récupère le texte chiffré et le déchiffre en local avec la clé après #. Une fois le nombre fixé à la création atteint, le serveur supprime le texte chiffré ; un nouvel appel renvoie 410. Un robot d'aperçu qui s'arrête au HTML de la page de lecture n'a, dans le cas courant, ni la clé ni l'intention de cliquer sur ce bouton.

GET de la page
s.html?id={id}

Renvoie la page de lecture statique. Le titre est « Ouvrir un lien unique ». Il ne contient pas le texte en clair. Les cartes d'aperçu s'arrêtent en général ici.

Requête d'état
/secrets/{id}/status

Répond seulement encore là, déjà détruit ou expiré. La répéter n'ajoute pas une lecture.

Récupération du texte chiffré
/secrets/{id}

C'est cet appel qui compte comme une lecture. Après 1 par défaut, le texte chiffré est supprimé. Sur la page, cela correspond à « Ouvrir et afficher ».

La page de lecture affiche aussi une phrase que vous pouvez vérifier sur place : le bouton « peut consommer une lecture ». Sans scripts, le déchiffrement est impossible ; un bloc <noscript> le dit. Un robot d'aperçu qui ne lit que le HTML, sans exécuter de script, n'envoie même pas la requête d'état. Si un navigateur intégré exécute les scripts, il s'arrête d'abord à « Le texte chiffré est encore là » : il faut encore un clic sur le bouton.

03 / Robots

Quels robots viennent, et ce qu'ils emportent

Beaucoup d'outils savent dessiner une carte. Ce qu'ils emportent, c'est l'en-tête de la page, pas la clé après #, et encore moins le texte en clair déchiffré.

Le robot d'expansion de liens Slack, le collecteur d'embeds Discord et la requête côté serveur dont Microsoft Teams se sert pour construire une carte appartiennent à la même famille : GET de la page, puis recherche d'un titre et d'un extrait dans le HTML. Discord s'identifie comme Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com). Les descriptions publiques de Discordbot s'accordent sur une limite que vous pouvez traiter comme hypothèse de travail : il analyse le HTML renvoyé par le serveur et n'exécute pas le JavaScript. Slack est explicite sur une autre limite. Après avoir expérimenté robots.txt, Slack a cessé de le respecter comme le ferait un crawler de recherche, parce que le développement d'un lien « agit pour le compte d'un humain » et ne parcourt pas le site. Mettre noindex sur la page de lecture peut empêcher les moteurs de l'indexer. Cela n'empêchera pas la carte dans le canal.

La page de lecture UsePwd est une vue temporaire de texte chiffré. Elle porte noindex, nofollow et n'entre pas dans le plan du site. Le titre du document est fixé à « Ouvrir un lien unique ». La description dit seulement que le déchiffrement se termine dans cet onglet et que la clé se trouve après #. Si une carte d'aperçu apparaît, le canal voit cette phrase générique — pas le mot de passe, le jeton ou le texte de ticket que vous avez saisi. Cela peut être vrai en même temps que « le journal d'accès n'a pas le fragment ». La carte prouve qu'un GET a touché la page d'atterrissage. Le journal n'a toujours pas la clé après #.

Slack indique que le résultat d'expansion d'une même URL est mis en cache pendant environ 30 minutes. Coller deux fois le même lien de test dans un canal, dans un intervalle court, ne produit pas forcément une seconde récupération. Pour vérifier « un robot est-il passé », cherchez un User-Agent du type Slackbot-LinkExpanding ou Discordbot dans vos propres journaux d'accès. Ne vous fiez pas au nombre de rafraîchissements de la carte. Un GET vers s.html ne permet toujours pas de conclure que /api/secrets/{id} a été appelé.

HTML de la page d'atterrissage 01 L'aperçu prend souvent cette couche. Titre générique, sans texte en clair ni clé après #.
Interface d'état 02 Seuls les scripts de la page l'interrogent. L'interroger ne consomme pas de lecture.
Interface du texte chiffré 03 Correspond à « Ouvrir et afficher ». Une carte d'aperçu ordinaire n'atteint pas cette couche.
L'URL complète dans l'historique du chat 04 C'est une autre copie. Un compteur inchangé ne veut pas dire que le lien n'existe plus que dans la tête du destinataire.
04 / Consommation

Quand une lecture est vraiment consommée

« Pas forcément consommée » n'est pas « jamais consommée ». Seule une visite qui atteint « Ouvrir et afficher » entre dans la couche du texte chiffré.

Le consommateur le plus courant est le destinataire lui-même : il ouvre le lien complet, voit « Le texte chiffré est encore là », puis clique sur « Ouvrir et afficher ». Le nombre par défaut est 1. Après cet appel réussi, le serveur supprime le texte chiffré ; la même URL rouverte indique « Déjà détruit ». Si vous avez fixé 2 lectures ou plus à la création, le texte chiffré reste après les premiers appels, jusqu'à ce que le compteur atteigne la limite. L'expiration le supprime aussi : 24 heures par défaut, ou 1 heure, ou 7 jours ; « détruit après lecture seulement » ne coupe que sur le nombre, pas sur l'horloge.

La deuxième classe, ce sont les environnements qui exécutent les scripts et simulent un clic. Certaines passerelles de sécurité messagerie et certains bacs à sable de liens ouvrent l'URL dans un navigateur isolé ; quelques-uns cliquent aussi le bouton principal de la page. Ce n'est plus « dessiner une carte », c'est une autre visite complète, comme celle d'une personne. Si le bac à sable clique sur « Ouvrir et afficher », la lecture est consommée et le destinataire verra ensuite l'état détruit. Cette couche se vérifie dans le rapport de la passerelle, pas en déduisant depuis la carte du chat.

La troisième classe, c'est d'envoyer directement l'adresse de l'API qui délivre le texte chiffré. L'adresse de lecture est s.html?id= ; celle qui consomme une lecture est /api/secrets/{id}. Un utilisateur ordinaire ne copie pas la seconde. Si quelqu'un colle l'URL de l'API dans un canal qui génère un aperçu, et que cet outil traite le premier GET comme une récupération de texte chiffré, la lecture sera consommée dès l'aperçu. La forme de partage UsePwd n'emprunte pas cette adresse : la page de création copie le lien de lecture, avec #.

Ne pas inverser

Un aperçu qui n'a pas brûlé de lecture ne signifie pas que le secret n'existe que chez le destinataire. L'outil de messagerie conserve l'URL complète ; un administrateur d'espace de travail peut encore exporter l'historique. Le nombre de lectures limite la durée de vie du texte chiffré sur le serveur, pas le nombre de personnes qui peuvent encore ouvrir cette adresse dans le canal.

05 / Vérification

Comment vérifier l'aperçu sur place

L'objectif n'est pas de prouver que « tous les outils de messagerie du monde ne lisent jamais le texte chiffré ». C'est de prouver qu'après l'apparition de la carte, l'API du texte chiffré n'a pas encore été appelée.

  1. 01
    Préparez un contenu de test, pas une vraie remise

    N'écrivez pas une clé API en service ni un mot de passe de connexion. Ouvrez par exemple le lien unique, saisissez PreviewCard-20260905, laissez 1 lecture et 24 heures. La page s'utilise dès l'ouverture. Les étapes ci-dessous servent à comparer aperçu et API, pas à transmettre ce texte à un collègue comme secret officiel.

  2. 02
    Notez le lien complet, ouvrez d'abord la page de lecture

    Après génération, vous devez voir les deux segments s.html?id= et #. Ouvrez le même lien dans le navigateur actuel. La page doit s'arrêter sur « Le texte chiffré est encore là » et afficher « Ouvrir et afficher ». Ne cliquez pas encore. Ouvrez le panneau Réseau avec F12 : vous devez voir un appel à /api/secrets/{id}/status ; vous ne devez pas voir un appel à /api/secrets/{id} sans le suffixe /status.

  3. 03
    Collez le même lien dans un canal de test qui génère un aperçu

    Utilisez un canal Slack rien que pour vous, un message privé Discord ou un groupe de test. Attendez la carte. Le titre doit se rapprocher de « Ouvrir un lien unique » et ne doit pas afficher PreviewCard-20260905. Revenez à la page de lecture, actualisez, ou ouvrez le même lien dans une fenêtre où le bouton n'a pas été cliqué : elle doit toujours indiquer « Le texte chiffré est encore là ». Si vous voyez déjà « Déjà détruit », une autre visite a atteint l'API du texte chiffré — ce n'est pas « la carte elle-même égale une lecture ».

  4. 04
    Si besoin, comparez le User-Agent dans les journaux d'accès

    Si vous voyez les journaux du site, la phase d'aperçu montre souvent un GET vers /fr/s.html?id=…, avec un User-Agent qui peut contenir Slackbot-LinkExpanding. Au même instant, vous ne devriez pas voir une récupération réussie de /api/secrets/{id}. Slack met en cache la même URL environ 30 minutes : recoller tout de suite ne produit pas forcément une seconde récupération.

  5. 05
    Cliquez ensuite seulement sur « Ouvrir et afficher »

    Cliquez maintenant. Le panneau Réseau doit montrer l'appel au texte chiffré, et la page affiche le texte de test. Fermez, puis rouvrez le même lien : il doit indiquer « Déjà détruit ». Cette étape sert à comparer l'état « après le bouton » et l'état « après la carte ». Une fois le test fini, jetez le lien. Ne le réassignez pas à un vrai destinataire.

Si vous devez seulement remettre une nouvelle clé à quelqu'un, ne collez pas d'abord le texte en clair dans le canal « pour tester une carte ». Séparez contenu de test et contenu réel. La remise officielle passe toujours par un lien unique. Pour le second tour de risque après une fuite de variables d'environnement, voir Après une fuite de variables d'environnement, pourquoi la nouvelle clé ne doit pas retourner dans le chat. Cet article dit « ne collez pas la clé API elle-même dans un historique cherchable » ; celui-ci dit « une fois le lien collé, à quelle couche l'aperçu s'arrête ».

06 / Frontières

Si le compteur n'a pas bougé, que reste-t-il dans le chat

Lire « la carte n'a pas brûlé le texte chiffré » comme « ce lien a disparu du canal » laisse de côté plusieurs frontières tout aussi vérifiables.

L'outil de messagerie conserve l'adresse entière que vous avez collée. Quiconque peut chercher l'historique, exporter l'espace de travail ou ouvrir une sauvegarde peut rouvrir la page de lecture. Tant que des lectures restent, une personne qui ouvre plus tard peut encore cliquer sur « Ouvrir et afficher » et lire le texte en clair. Une fois le nombre épuisé, l'historique garde un lien déjà détruit, plus le titre de la carte d'alors. L'export d'un administrateur ne ressuscite pas un texte chiffré déjà supprimé sur le serveur ; il n'efface pas non plus le fait que l'URL complète a figuré dans le canal.

Capture d'écran et transfert sont une autre copie. Dès que quelqu'un photographie le texte en clair après une lecture réussie, ou renvoie le lien vers un autre groupe qui génère un aperçu, la frontière n'est plus « ce GET-ci » mais « par qui passe le saut suivant ». Un lien unique limite la durée de vie et le nombre de lectures du texte chiffré sur le serveur ; il ne limite pas les captures côté destinataire. UsePwd n'a ni compte ni coffre, et ne peut pas retrouver un lien perdu par utilisateur. Pour une conservation durable ou une synchro entre appareils, il faut un gestionnaire de mots de passe dédié. L'identité du produit est dans À propos.

Les fichiers sont un troisième chemin. Une sauvegarde locale d'un fichier unique de 5 GB au plus passe par Chiffrer un fichier, au format .lock / .enc ; le fichier n'est pas envoyé par défaut. Le mot de passe lui-même se génère entre 6 et 128 caractères, puis se vérifie dans Tester un mot de passe. Ces pages, comme celle-ci, s'utilisent dès l'ouverture. Ne lisez pas « l'aperçu n'a pas consommé de lecture » comme « coller dans n'importe quel canal est sûr » : l'historique du canal et la récupération d'aperçu ne sont pas la même couche.

07 / Questions

Ce qu'on demande après un aperçu

Ces quatre réponses restent sur la frontière de cet article. Elles ne répètent pas les boutons de la page de création.

Voir une carte, est-ce déjà lu ? 01 En général non. La carte dit seulement que la page d'atterrissage a reçu un GET. La lecture attend « Ouvrir et afficher ».
Slack, Discord ou Teams exécutent-ils les scripts ? 02 La récupération côté serveur pour la carte lit en général le HTML seulement. Les scripts s'exécutent quand quelqu'un ouvre le navigateur intégré, et le texte chiffré attend encore le bouton.
Le robot d'aperçu voit-il la clé après # ? 03 Une requête HTTP n'emporte pas le fragment. Quand le robot va chercher l'URL, il n'emmène en général que l'identifiant après le point d'interrogation.
Faut-il un compte pour créer ou lire ? 04 Non. Ouvert tout de suite. À droite de la barre supérieure, seul le sélecteur de langue — pas de connexion ni de coffre.
08 / Ensuite

Ensuite, vérifiez une carte d'aperçu

L'article répond à « pourquoi, après un aperçu, le nombre de lectures n'est pas forcément déjà consommé ». Pour générer sur place un lien de test que vous n'utiliserez pas pour une vraie remise, puis le coller dans un canal de test, ouvrez Lien unique. Inutile de s'inscrire d'abord.