L’exploitation envoie un mot de passe de base à un collègue — le plus simple, un lien cliquable. Dès qu’on clique, le lien traverse navigateur, proxy, origine et une pile de journaux. Ce que tu contrôles, ce n’est pas « la crypto a l’air sûre », c’est à quelle couche la clé apparaît.
Derrière ?key=, elle fait partie de la requête HTTP et entre presque sûrement dans l’access log. Derrière #, le navigateur l’ôte avant d’envoyer — pas une promesse produit, c’est le traitement du fragment dans la spec URI. Ce texte : pourquoi la clé doit être après le dièse, et comment voir que le serveur n’a pas reçu ce morceau.
Ce qui reste dans les journaux si la clé est en query
La query (de ? jusqu’avant #) fait partie de la cible de requête. Un appel à /s.html?id=abc&key=MONSECRET envoie chemin et query sur le fil. L’origine les voit, et devant elle Nginx, CDN, WAF, APM. Le format d’access log usuel contient l’URI — key=MONSECRET se retrouve sur la même ligne que le statut et la durée.
Ce n’est pas une config exotique. Les formats par défaut de Nginx et de beaucoup de PaaS journalisent l’URI. Une fuite de ces logs — ticket, export SIEM, bundle support — emporte la clé, même si l’app « ne stocke rien ».
Le referrer aggrave. Si la page de lecture charge un tiers sans politique stricte, l’URL complète avec query peut entrer dans leurs logs. Le fragment n’appartient pas au referrer ; la query, souvent si.
Ce que le navigateur fait du fragment — et ce qu’il ne fait pas
RFC 3986 : le fragment désigne un endroit dans la ressource, il ne fait pas partie de la requête serveur. Avant l’HTTP, le navigateur coupe # et tout ce qui suit. Le serveur MyPassGen voit /s.html?id=…, pas la clé.
Le JavaScript de l’onglet lit encore location.hash — c’est ainsi que la page de lecture déchiffre ici. « Le serveur ne le voit pas » ≠ « personne dans l’onglet ne le voit ». Une extension, un XSS ou une capture de la barre d’adresse voient le fragment. La couche fermée ici, c’est la requête HTTP, donc les access logs typiques.
Presse-papiers, fil de chat et archive mail sont une autre couche. Partager le lien complet, c’est partager la clé. Le lien éphémère réduit les relectures et le clair côté serveur, pas « l’autre ne peut pas copier ».
Qui voit la query, qui voit le fragment
| Couche | Query ?key= | Fragment #key |
|---|---|---|
| Requête HTTP vers l’origine | oui | non, le navigateur coupe |
| Access log, WAF, CDN | le plus souvent oui | en général non |
| Referrer vers un tiers | souvent oui | en général non |
| JavaScript dans l’onglet | oui | oui, location.hash |
| Extension / XSS / épaule | oui | oui |
Les liens MyPassGen ressemblent à …/s.html?id={id}#{key}. La query n’a que l’id, pour que le serveur trouve le chiffré. La clé reste après #. La lecture est ouverte — sinon l’autre devrait créer un compte, et l’envoi unique serait mort.
Vérifier dans le panneau Réseau
Créer un lien éphémère. Court texte de test, copier le lien. Dans la barre : id en query, clé après #.
Réseau, Preserve log. Ouvrir la lecture dans le même onglet ou un autre. Regarder la requête vers s.html et l’API du chiffré.
Chercher la clé. Coller dans le panneau les caractères après #. Ils ne doivent figurer ni dans l’URL, ni la query, ni le payload des appels serveur.
Rouvrir sans fragment. Appeler seulement ?id=. La page doit constater l’absence de clé, pas la deviner. Le serveur ne peut pas livrer le clair — il n’a jamais vu la clé.
Ce que ça montre
Tu vérifies : la clé a-t-elle voyagé en HTTP ? Pas : personne sur terre ne peut lire location.hash. Pour les access logs et le WAF, query contre fragment suffit.
Ce que le fragment ne sauve pas
L’historique et les captures de la barre d’adresse portent souvent le lien complet. Partager dans un chat, c’est partager la clé. Un onglet compromis lit location.hash comme n’importe quel script. Zéro connaissance serveur n’est pas zéro connaissance sur l’appareil du destinataire.
Le lien éphémère ne prétend pas bloquer les captures. Il sépare chiffré (un moment sur le serveur) et clé (seulement dans le fragment client) et brûle après la première lecture. Pas plus, pas moins.
Si tu veux le refaire
Crée un lien de test sur lien éphémère, ouvre Réseau, cherche le morceau après #. Puis le même lien sans fragment. La lecture n’exige pas de compte — sinon le test mourrait déjà contre un mur de connexion.
Pour le « pourquoi le calcul reste dans l’onglet » : pourquoi la crypto locale. Pour un fichier plutôt que 32 Ko de texte : coffre, AES-256-GCM en flux, sortie .lock / .enc.