Le 26 juillet 2026, des développeurs sur X ont commencé à publier des requêtes site: renvoyant des pages entières de conversations Claude partagées. Selon ces signalements, les résultats contenaient des clés d'API, des identifiants, des détails de portefeuilles crypto, des CV avec noms et numéros de téléphone, des notes de projets internes d'entreprises, et jusqu'à un avocat traitant un problème de déontologie. Anthropic n'avait pas réagi à l'heure de la rédaction, et l'ampleur de l'exposition n'a pas été vérifiée de manière indépendante.
Si cette histoire vous semble familière, c'est normal. En août 2025, Fast Company a trouvé des milliers de conversations ChatGPT partagées dans les résultats Google, et OpenAI a supprimé son option « rendre cette conversation découvrable » en quelques jours. En septembre 2025, Forbes rapportait que Google avait indexé un peu moins de 600 conversations Claude partagées — alors même qu'Anthropic bloquait les robots via robots.txt.
Trois incidents, deux éditeurs, un an. Ce n'est pas un problème d'éditeur. C'est un patron de conception qui fuit par défaut, et presque toutes les équipes qui livrent un produit IA en 2026 en ont construit un.
Le lien de partage est une frontière de sécurité que personne ne traite comme telle
Chaque produit de conversation IA embarque la même fonctionnalité. L'utilisateur clique sur Partager, l'application génère une URL, et quiconque détient cette URL peut lire la conversation. C'est le modèle de partage le moins coûteux possible : pas de comptes, pas d'ACL, pas d'invitations. Les équipes produit l'adorent parce qu'il convertit — une conversation partagée est un canal d'acquisition gratuit.
Le problème tient au modèle mental qu'il installe. « Toute personne disposant du lien » sonne comme un lien privé que vous contrôlez. L'utilisateur le lit comme non répertorié. Le système implémente en réalité public, simplement pas encore découvert. L'écart entre ces deux lectures est exactement l'endroit où vivent tous ces incidents.
« Non découvert » n'est pas une propriété de sécurité. C'est un état temporaire, et au moins quatre forces l'érodent :
- Fuite par le référent. L'utilisateur ouvre son lien de partage, clique sur un lien sortant de la page, et les statistiques du site de destination enregistrent l'URL de partage dans l'en-tête
Referer. Cette URL se retrouve dans les journaux d'un tiers — et, dans certains produits d'analytics, dans une interface qui se fait indexer. - Propagation sociale et sites de collage. Les liens publiés sur X, Discord, Reddit, Stack Overflow ou un Pastebin public deviennent des liens entrants explorables. C'est l'explication avancée par Anthropic pour l'incident de 2025, et le mécanisme est réel — mais il explique seulement comment les robots ont trouvé les pages. Il n'explique pas pourquoi ces pages leur étaient servies.
- Télémétrie des navigateurs et des extensions. Barres d'outils, extensions « assistant IA » et certains navigateurs mobiles transmettent les URL visitées à des services distants. Plusieurs jeux de données SEO ont historiquement été constitués ainsi.
- Énumération. Si les jetons de partage sont séquentiels, courts ou dérivés d'un horodatage, il suffit de les deviner.
robots.txt ne protège contre aucun de ces vecteurs. C'est une requête adressée aux robots bien élevés, pas un contrôle d'accès, et il ne retire pas une URL déjà présente dans un index. Anthropic a fait le geste poli et a fini dans Forbes malgré tout.
Pourquoi le correctif passe systématiquement à la trappe
Ce bug se répète parce qu'il siège à la jointure de trois équipes. Le produit possède le bouton Partager. Le frontend possède la page. L'infrastructure possède les en-têtes. Personne ne possède la question « cette page est-elle indexable ? », alors la réponse par défaut est oui.
Il est aussi quasi invisible aux tests. Une page de partage fonctionne parfaitement en QA, en préproduction et le jour du lancement. La défaillance ne se manifeste que des semaines plus tard, dans l'index de quelqu'un d'autre, découverte par un inconnu lançant une requête site:. Aucun test en échec, aucun taux d'erreur, aucune alerte — ce qui explique précisément pourquoi il survit jusqu'en production et y reste.
Construire des liens de partage qui ne fuient pas
Si vous livrez une fonctionnalité de partage — pour une conversation IA, un rapport, un tableau de bord ou un document généré — voici la liste de contrôle qui tient vraiment.
1. Bloquez l'indexation par l'en-tête, pas seulement par robots.txt
robots.txt empêche l'exploration. X-Robots-Tag empêche l'indexation, et il fonctionne même lorsqu'un robot atteint la page via un lien entrant découvert ailleurs. Configurez-le en périphérie pour qu'aucune route ne puisse l'oublier :
// next.config.js — s'applique à toutes les routes de partage, sans activation page par page
module.exports = {
async headers() {
return [
{
source: '/share/:path*',
headers: [
{ key: 'X-Robots-Tag', value: 'noindex, nofollow, noarchive, nosnippet' },
{ key: 'Referrer-Policy', value: 'no-referrer' },
],
},
]
},
}La ligne Referrer-Policy: no-referrer accomplit un travail discret mais essentiel : elle empêche que l'URL de partage soit transmise à chaque site vers lequel le lecteur clique.
Ajoutez aussi la balise meta, pour les moteurs de rendu qui ne voient que le HTML :
// app/share/[token]/layout.tsx
export const metadata = {
robots: { index: false, follow: false, nocache: true },
}2. Rendez les jetons indevinables
Utilisez au moins 128 bits d'aléa cryptographique. Ne dérivez jamais le jeton de l'identifiant de conversation, de l'identifiant utilisateur ou d'un horodatage.
import { randomBytes } from 'node:crypto'
// 32 caractères base64url, environ 192 bits d'entropie — non énumérable
export const createShareToken = () => randomBytes(24).toString('base64url')3. Faites expirer par défaut
Le contrôle au meilleur rapport effort/effet. Un lien qui meurt au bout de 30 jours ne peut pas fuiter au sixième mois. Rendez l'expiration par défaut, faites du lien permanent un choix explicite, et affichez la date d'expiration dans la boîte de dialogue pour que l'utilisateur comprenne ce qu'il crée.
create table share_links (
token text primary key,
conversation uuid not null references conversations(id) on delete cascade,
created_by uuid not null references users(id),
expires_at timestamptz not null default now() + interval '30 days',
revoked_at timestamptz,
view_count int not null default 0
);4. Analysez le contenu avant de générer le lien
C'est le contrôle qui aurait le plus compté dans l'incident signalé. Avant la création d'un lien de partage, passez la conversation dans un détecteur de secrets et avertissez l'utilisateur de ce qu'il s'apprête à publier. Traitez cela comme une étape bloquante de consentement éclairé, pas comme une notification fugace.
const SECRET_PATTERNS = [
{ label: "Clé d'accès AWS", re: /AKIA[0-9A-Z]{16}/ },
{ label: 'Bloc de clé privée', re: /-----BEGIN (RSA |EC |OPENSSH )?PRIVATE KEY-----/ },
{ label: 'Jeton Bearer', re: /\b(sk|pk)-[A-Za-z0-9]{20,}\b/ },
{ label: 'Jeton JWT', re: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\./ },
]
export function findSecrets(text) {
return SECRET_PATTERNS
.filter(({ re }) => re.test(text))
.map(({ label }) => label)
}Associez la couche d'expressions régulières à un contrôle d'entropie pour les chaînes très aléatoires qu'aucune liste de motifs ne rattrapera, et affichez les résultats en contexte : « Cette conversation semble contenir une clé d'accès AWS. La publier rendra cette clé lisible par toute personne disposant du lien. »
5. Offrez une surface de révocation que les utilisateurs trouvent
Chaque compte rendu d'incident se termine par la même consigne : allez dans les paramètres, trouvez les conversations partagées, supprimez celles que vous regrettez. Cette page doit exister, être accessible en deux clics, lister chaque lien actif avec sa date de création et son nombre de vues, et permettre de tout révoquer. On ne nettoie pas une exposition que l'on ne voit pas.
6. Faites que la révocation supprime réellement le contenu
Supprimer la ligne en base ne suffit plus une fois la page mise en cache ou indexée. Un lien révoqué doit renvoyer un 410 Gone ferme, et votre procédure d'exploitation doit inclure les demandes de suppression via Google Search Console et Bing Webmaster Tools. Rédigez cette procédure avant d'en avoir besoin.
7. Ajoutez le test de non-régression
Ce bug se répète parce que rien n'échoue lorsqu'il est présent. Corrigez cela :
test('les pages de partage ne sont jamais indexables', async () => {
const res = await fetch(`${BASE_URL}/share/${knownToken}`)
const robots = res.headers.get('x-robots-tag') ?? ''
expect(robots).toContain('noindex')
expect(res.headers.get('referrer-policy')).toBe('no-referrer')
})Dix lignes en intégration continue, exécutées à chaque déploiement. C'est toute la différence entre une fonctionnalité qui marche et une une de Forbes.
Ce que les entreprises doivent faire cette semaine
Si votre organisation utilise des assistants IA — et en 2026 c'est le cas, avec ou sans validation officielle — le lien de partage est un canal de sortie de données non surveillé. Il contourne votre DLP, votre proxy et votre passerelle de messagerie, parce qu'il se résume à un utilisateur qui clique sur un bouton dans un onglet de navigateur.
Trois actions concrètes :
- Auditez ce qui circule déjà. Lancez
site:claude.ai/share,site:chatgpt.com/shareet les équivalents pour chaque assistant utilisé par vos équipes, en filtrant sur le nom de votre entreprise, vos noms de produits et vos domaines internes. Faites-le aujourd'hui, avant que les index ne soient nettoyés et que vous ne perdiez la capacité de constater ce qui a été exposé. - Écrivez la politique dans l'outil, pas dans le règlement intérieur. Les offres entreprise des grands assistants permettent aux administrateurs de désactiver le partage ou de le restreindre à l'organisation. Une politique que personne ne peut faire respecter est un vœu ; un interrupteur désactivé est un contrôle.
- Considérez tout secret collé comme compromis. Si un identifiant est apparu dans une conversation ayant été partagée un jour, faites-le tourner. Le coût d'une rotation est d'une heure. Le coût de supposer que tout va bien est illimité.
Pour les équipes qui construisent leurs propres produits IA, la leçon plus large rejoint un thème récurrent de notre travail sur la sécurité des agents IA et l'architecture zero-trust et la gouvernance de l'IA en entreprise : la surface dangereuse est rarement le modèle. C'est la plomberie web ordinaire enroulée autour de lui, bâtie par des gens qui pensaient aux taux de conversion plutôt qu'aux robots d'indexation.
La leçon en une ligne
Trois incidents en douze mois, chez deux des laboratoires d'IA les mieux dotés au monde, tous imputables à la même omission : une page de partage servie à un robot d'indexation.
Les valeurs par défaut sûres ne sont pas une fonctionnalité que l'on ajoute quand un utilisateur se plaint. C'est ce que l'on livre en premier, parce que le mode de défaillance est silencieux, différé et irréversible. noindex coûte une ligne. Expliquer à un client pourquoi ses clés d'API sont sur Google coûte considérablement plus cher.
Vous construisez un produit IA sans savoir ce que vos surfaces de partage, de journalisation et de rétention exposent réellement ? Noqta réalise des revues de sécurité d'architectures applicatives IA pour des équipes en Tunisie et dans le Golfe.
Sources : Forbes — Hundreds Of Anthropic Chatbot Transcripts Showed Up In Google Search · Search Engine Land — ChatGPT kills Google-indexable chats · Engadget — OpenAI is removing ChatGPT conversations from Google