Leaky Forms : des milliers de sites récupèrent les emails avant de valider un formulaire

Nicolas Furno |

Les formulaires web que l’on doit remplir pour créer un compte sur de nombreux sites peuvent être indiscrets et transmettre des informations sans notre accord. C’est ce que révèle l’enquête nommée « Leaky Forms » menée par quatre universitaires spécialistes en sécurité. Sur des milliers de sites web, l’adresse email est enregistrée dès qu’elle a été saisie par l’utilisateur, même s’il ne valide pas le formulaire. Dans quelques cas plus rares, le mot de passe d’un compte nouvellement créé peut même être transmis par erreur.

Sur cet exemple fourni par les chercheurs, le formulaire de création de compte de Gitlab.com (concurrent de GitHub) transmet l’adresse mail dès qu’elle a été saisie, même sans valider le formulaire. On voit distinctement l’adresse mail dans la console du navigateur, en bas, alors que le formulaire est toujours en train d’être rempli.

En théorie, les informations saisies dans un formulaire web ne sont transmises que lorsque l’utilisateur choisit de l’envoyer, en appuyant sur un bouton le plus souvent. Si l’internaute choisit de ne pas valider son inscription, il devrait pouvoir annuler l’opération en fermant la page web et tout ce qu’il aura saisi ne devrait pas avoir été enregistré par le site. En réalité, des milliers de sites web ne respectent pas cette bonne pratique et récupèrent les informations dès qu’elles sont saisies. Tous les navigateurs web, y compris Safari, sont touchés.

Cette méthode peu scrupuleuse permet aux sites web d’obtenir de nombreuses adresses mail même si les visiteurs ne s’abonnent pas à leur site. Ces adresses peuvent être utilisées à des fins de statistiques, ajoutées à une liste de diffusion ou même revendues à un tiers. Les chercheurs ont analysé automatiquement les 100 000 sites les plus populaires et découvert cette pratique pour 2950 aux États-Unis et encore 1 844 en Europe, malgré son irrespect total du RGPD.

Dans 52 cas, c’est même le mot de passe qui était transmis dès sa saisie dans le formulaire, mais c’était une erreur qui a été corrigée dès que les chercheurs ont envoyé l’information. Une erreur liée à l’utilisation de scripts « clés en mains » fournis aux sites web par les services spécialisés dans la publicité et le marketing en ligne. Ou par des entreprises comme Meta (ex-Facebook) et TikTok, qui peuvent récupérer des informations sur les formulaires des sites tiers qui utilisent leurs outils.

Le site canadien de la Croix Rouge transmet à TikTok, sans doute à son insu, les adresses mail saisies dans le formulaire dédié à sa liste de diffusion. L’adresse est ici « hachée » en SHA256, mais il est facile de la retrouver en clair de l’autre côté.

Les chercheurs ont contacté Meta et TikTok, ainsi que les services publicitaires impliqués par ces collectes pour leur remonter l’information, notamment sous l’angle du RGPD. Quand ils ont fait une nouvelle analyse en début d’année, ils ont noté une baisse significative du nombre de sites qui transmettaient les informations des formulaires dès leur saisie, du moins en Europe. Dans un grand nombre de cas, la transmission ne se faisait plus sans avoir validé au préalable le partage de données avec un pop-up initial. La baisse est toutefois nettement moins significative aux États-Unis, où la réglementation est plus souple.

Les résultats de la recherche sont disponibles dans cet article universitaire, mais on peut aussi consulter des listes des sites les plus populaires détectés sur cette page web plus accessible. Le code source de l’outil chargé d’analyser les sites est disponible sur GitHub et on peut aussi utiliser LeakInspector, une extension web qui avertit si un site est concerné. L’extension ne respecte pas les exigences de Chrome (elle doit accéder aux requêtes web effectuées par une page) et ne sera pas proposé directement pour le navigateur de Google, mais une version pour Firefox devrait être fournie par les chercheurs.


avatar Chris K | 

C’est sûrement un peu tard mais depuis sa mise à dispo j’utilise systématiquement l’option masquer l’e-mail.

avatar Yoshi_1 | 

@Chris K

Je pense qu’il n’est jamais trop tard pour améliorer son hygiène numérique 😊

avatar YuYu | 

@Chris K

Je viens de m’y mettre, je suis en train de basculer mes 600 comptes sur des adresses uniques 👍

avatar crazy_c0vv | 

Moi aussi je l’utilise tout le temps maintenant ou presque. C’est malheureusement un peu plus difficile lorsqu’il faut communiquer son adresse e-mail à un humain au lieu d’un formulaire.

Mais les adresses générées sont parfois assez rigolotes :P

avatar AirForceThree | 

L'adresse email est transmise avant soumission du formulaire, mais c'est peut-être à des fins de validations - vérifier si l'adresse est bien formée et valide (pas jetable par exemple) - sans pour autant être enregistrée en base de donnée ?

avatar Paquito06 | 

@AirForceThree

“L'adresse email est transmise avant soumission du formulaire, mais c'est peut-être à des fins de validations - vérifier si l'adresse est bien formée et valide (pas jetable par exemple) - sans pour autant être enregistrée en base de donnée ?”

C’est surement un custom server call (javascript) dès que du contenu est entré dans le champs, et c’est quand meme immediatement recupere depuis le front end, envoyé en base de donnees (pour les analytics) et recuperable en back end (avec sql). Les sites concernés par le leaky forms ne sont pas des banques (elles ne peuvent pas capturer des emails qui n’ont pas ete envoyés, les PII c’est strict en finance), ne tombent pas sous le coup du CCPA (RGPD US, hebergés/faisant du business en Californie). Faut toujours jongler avec plusieurs emails perso de toute facon, un pour les junk/spam, un pour le quotidien, un serieux/selectif.

avatar marc_os | 

@ AirForceThree

> c'est peut-être à des fins de validations - vérifier si l'adresse est bien formée et valide

La norme du format d'un email est triviale et la validation peut être faite facilement par du code javascript exécuté par le navigateur sans rien envoyer au serveur.

> pas jetable par exemple

Aucune norme ne permet de dire si une adresse est "jetable" ou non. D'ailleurs, qu'entendez-vous par une adresse "jetable" ?

Bref, ces sites n'ont aucune excuse pour envoyer vers leurs serveurs l'email saisi avant que l'utilisateur n'ait validé le formulaire.

avatar jackhal | 

"La norme du format d'un email est triviale et la validation peut être faite facilement par du code javascript exécuté par le navigateur sans rien envoyer au serveur."

Dans ce cas ça n'est qu'une vérification partielle. Si tu veux être sûr que l'adresse email est valable, tu dois simuler un envoi d'email.
Une adresse comme wwwwww.xxxxxx@yyyyyy.zz peut passer une validation basique, alors qu'elle est fausse.

avatar jackhal | 

Tiens, voilà un bon exemple : MacG l'a convertie en lien cliquable ^^

avatar marc_os | 

@ jackhal

> Tiens, voilà un bon exemple : MacG l'a convertie en lien cliquable ^^

Rien à voir.

avatar jackhal | 

Bah si : ça ressemble à une adresse email, mais même le TLD n'existe pas. Ça n'est clairement pas une adresse email, ça n'est pas parce que le format y ressemble que ç'en est une.

avatar marc_os | 

@ jackhal

Il aurait fallu dire un exemple de quoi.

> ça ressemble à une adresse email
> Ça n'est clairement pas une adresse email
Oui et oui, et alors ?
Bien que. Qui vous dit que « Ça n'est clairement pas une adresse email » si le domaine yyyyyy.zz existe ?
Le format est valide, et ça suffit vu du formulaire.
Ce n'est pas à la page web d'essayer de vérifier si cette adresse existe pour de vrai en lousdé.

avatar marc_os | 

@ jackhal

> Dans ce cas ça n'est qu'une vérification partielle. Si tu veux être sûr que l'adresse email est valable, tu dois simuler un envoi d'email.

Tu ne peux pas "simuler un envoi", tu ne peux qu'envoyer un mail et vérifier si tu as un code retour du serveur disant que l'adresse est invalide. Si tu ne reçois pas de code d'erreur, alors il y a une chance que l'adresse soit valide. Pour être sûr, tu dois ajouter un "pixel caché" ou tout autre moyen pour vérifier que ton destinataire aura bien ouvert ton mail.
Or, ces pratiques sont plus que douteuses.
Sinon, tu peux te contenter de vérifier l'existence du domaine, ce qui peut être fait depuis la navigateur.
Quoiqu'il en soit, rien ne justifie le fait de vouloir le faire à l'insu de la personne qui remplit le formulaire. Il sera bien temps de la faire quand l'utilisateur aura validé le formulaire. Alors seulement un envoi de mail de confirmation (ou tout autre moyen de validation) sera justifié.
Vouloir le faire à l'insu de l'utilisateur, c'est juste malhonnête.

avatar jackhal | 

"Tu ne peux pas "simuler un envoi", tu ne peux qu'envoyer un mail"
Tu peux commencer un envoi d'email et voir ce que le serveur répond sans envoyer d'email.
Exemple de classe toute prête : https://packagist.org/packages/zytzagoo/smtp-validate-email

"Pour être sûr, tu dois ajouter un "pixel caché" ou tout autre moyen pour vérifier que ton destinataire aura bien ouvert ton mail."
Un pixel caché, c'est susceptible d'être bloqué. https://www.macrumors.com/2021/06/10/ios-15-mail-privacy-protection-tracking-pixels/
Quitte à envoyer un email, autant mettre un lien cliquable de validation de création de compte. Ça a l'avantage de vérifier que la personne qui a demandé à créer le compte est bien celle qui a utilisé l'adresse email sur le formulaire.

avatar marc_os | 

@ jackhal

> Tu peux commencer un envoi d'email et voir ce que le serveur répond sans envoyer d'email
Sauf que :
The SMTPValidateEmail\Validator class retrieves MX records for the email domain [1] and then connects to the domain's SMTP server to try [2] figuring out if the address really exists.
1. c'est ce que je disais. Tu peux même le faire en javascript, pas besoin d'envoyer le mail à ton seveur.
2. Aucune garantie n'est donnée.

> Un pixel caché, c'est susceptible d'être bloqué.
Evidemment.
N'ai-je pas dit que c'est une technique de malandrin ?

> Quitte à envoyer un email, autant mettre un lien cliquable de validation de création de compte.
C'est également ce que j'ai écrit quand j'ai parlé de l'envoi de mail de confirmation.

Et je le répète : Tenter de valider de la sorte l'adresse mail du visiteur est juste MALHONNÊTE. Entendu ?

avatar Yoshi_1 | 

@AirForceThree

Je pense qu’une vérification du format de l’email peut être faite en local.

avatar nmo | 

“ L'adresse email est transmise avant soumission du formulaire, mais c'est peut-être à des fins de validations - vérifier si l'adresse est bien formée et valide (pas jetable par exemple) - sans pour autant être enregistrée en base de donnée ?”

Ce qui est un très mauvais prétexte.

Tenter de vérifier la validité d’une adresse e-mail juste en analysant la chaîne de caractère saisie est foireux, surtout quand les critères utilisés ne respectent même pas les RFC. C’est comme ça qu’on arrive à des formulaires qui refusent les domaines persos ou pro (tout ce qui n’est pas @gmail.com ou @outlook.com, etc.), ou qui refusent parce que le formulaire ne connaît pas le TLD, ou qui rejettent l’adresse parce qu’elle ne contient qu’une lettre avant l’@, etc.

La seule manière fiable et valable de vérifier la validité de l’adresse e-mail de l’utilisateur, c’est d’y envoyer un messager contenant un lien à cliquer ou un code de validation à saisir (quelque part sur la page Web).

À la rigueur, le formulaire peut vérifier que la chaîne de caractère saisie dans le champ e-mail contient un @, avec vaguement quelque chose avant et vaguement quelque chose après. Rien de plus. Toute autre analyse est foireuse et fini un jour ou l’autre par emmerder les utilisateurs.

avatar DP-Britto | 

C'est quand même incroyable ça...

avatar HoulaHup | 

"L’adresse est ici « hachée » en SHA256, mais il est facile de la retrouver en clair de l’autre côté." : Je veux bien que vous m'expliquiez comment retrouver la donnée initiale d'un haché. Ça pourrait même intéresser beaucoup de monde.

avatar Erravid | 

Ça ressemble à du traçage tout en prétextant une anonymisation. Je ne connais pas les détails de l'implémentation, mais si TikTok a déjà ton adresse e-mail (un compte ouvert chez eux), ils connaissent le hash. Quand le site canadien de la Croix Rouge leur transmet un hash, ils peuvent comparer pour retrouver le propriétaire du compte TikTok et donc faire fonctionner leur système publicitaire. Ils peuvent par exemple fournir la preuve au site canadien de la Croix Rouge que cet utilisateur a vu une publicité de la Croix Rouge quelques minutes avant de faire un don, donc la publicité a marché et la Croix Rouge va payer TikTok.

Même si TikTok n'a pas l'adresse email, ils peuvent construire un profil publicitaire de tous les sites qui ont envoyé ce même hash, qui montrera les habitudes de navigation et consommation de la personne. J'imagine que ce genre d'infos doivent pouvoir se revendre à des régies publicitaires pour afficher des bandeaux avec des produits similaires sur les sites.

Encore une fois, je ne suis pas un expert et n'ai jamais recherché comment TikTok fonctionnait.

avatar lmouillart | 

L'ago de hachage SHA est déterministe, donc les mêmes entrées donnent les mêmes sorties.
Il existe des bases de données, dont les mails, ont fui, il suffit de les encoder en SHA256, d'avoir une correspondance et bingo on peut compléter facilement les données qui manquent sur un profil dont le mail à fuit.

avatar pariscanal | 

Baleque j utilise l adressée masquée Apple maintenant :) c est génial 🤩

avatar marc_os | 

« Si l’internaute choisit de ne pas compléter son inscription »

En français, on dit : « Si l’internaute choisit de ne pas valider son inscription »

Je sais, même des caisses automatiques au supermarché dont les messages utilisateur sont rédigés par de grands spécialistes en littérature vous demandent parfois de "compléter votre transaction en saisissant votre code pin", erreur accouplée à un pseudo jargon financier... Je ne sais pas pour vous, mais moi à ce genre de caisse "je valide mon paiement".
Cet usage relativement nouveau vient probablement des informaticiens, j'imagine à force de voir le l'adjectif "complete".
Paradoxe : Il n'existe pas de verbe to complete en anglais, uniquement l'adjectif "complete" !
Cf: https://www.oxfordlearnersdictionaries.com/definition/english/complete_1?q=complete
(Idem pour l'anglais américain)

Ce qui est rigolo, c'est que l'adjectif anglais "complete" viendrait du français... complet (ou du latin completus)...

avatar Erravid | 

« To complete » est bien un verbe en anglais : https://dictionary.cambridge.org/dictionary/english/complete?q=complete

Sur Oxford : https://www.oxfordlearnersdictionaries.com/definition/english/complete_2

Pour l'usage français, vous avez raison et le sens est légèrement différent du sens en anglais !

avatar marc_os | 

@ Erravid

Cambridge se serait donc pas d'accord avec Oxford ?!
Une guerre d'universités ? 😜
On a bien Robert et Larousse ici...
Ceci dit merci, je mourrai moins bête, mais... 😉

avatar Bruno de Malaisie | 

@marc_os

To complete veut dire terminer, achever ou finaliser en anglais.
To complete an exam.
Et oui, cela vient du français et du latin comme 80% de la langue anglaise.

avatar Paquito06 | 

@marc_os

“« Si l’internaute choisit de ne pas compléter son inscription »
En français, on dit : « Si l’internaute choisit de ne pas valider son inscription »”

Tu valides une inscription en verifiant l’email que tu as entré en checkant ta mailbox. Tu voulais employer le mot “finaliser”. Si l’internaute ne finalise pas son inscription, alors il ne peut pas la valider.

“Paradoxe : Il n'existe pas de verbe to complete en anglais, uniquement l'adjectif "complete" !

Cf: https://www.oxfordlearnersdictionaries.com/definition/english/complete_1?q=complete

(Idem pour l'anglais américain)”

Alors apple ne doit pas parler anglais du coup (et moi non plus, depuis tout ce temps 😅) car a chaque fois que je mets a jour mon iPhone, il y a le logo de la pomme croquee, la barre de chargement en dessous, puis enfin une ligne qui affiche:
“iPhone will restart when update completes”
😱🤣

“Ce qui est rigolo, c'est que l'adjectif anglais "complete" viendrait du français... complet (ou du latin completus)..

Comme les ~ 2/3 de la langue anglaise provient du francais:
https://en.wikipedia.org/wiki/Influence_of_French_on_English

avatar marc_os | 

@ Paquito06

> Alors apple ne doit pas parler anglais du coup

Tu arrives près de quatre heures après la bataille, Erravid m'ayant déjà signalé mon erreur à 15h56.

avatar Paquito06 | 

@marc_os

“> Alors apple ne doit pas parler anglais du coup

Tu arrives près de quatre heures après la bataille, Erravid m'ayant déjà signalé mon erreur à 15h56.”

Ouais bah desolé, je faisais mon sport a 8am 😝

avatar tiagosilva | 

Je me suis toujours poser la question sur des sites qui demandent un enregistrement, mais qui au fur et à mesure des saisies sont de plus en plus exigeants en information et pour lesquels j'abandonne en cours de procédure.

Merci pour la news et comme quoi il faut être très, très prudent et, si possible, voir le mal partout et faire preuve, ponctuellement du moins, de vice afin de se mettre au même niveau que l'interlocuteur (le site web) et anticiper les éventuels pièges...

Je suis certain que l'on ne voit ici que la surface des choses et que pour un utilisateur lambda comme moi, je dois me “faire avoir” bien trop souvent...

avatar brunnno | 

"Dans 52 cas, c’est même le mot de passe qui était transmis dès sa saisie dans le formulaire, mais c’était une erreur qui a été corrigée dès que les chercheurs ont envoyé l’information.
Une erreur liée à l’utilisation de scripts « clés en mains » fournis aux sites web par les services spécialisés dans la publicité et le marketing en ligne."

Une erreur, on y croit ! 🤣

avatar jb18v | 

dans le même style les sites qui t'envoient un mail parce que tu as un produit dans le panier sans l'avoir validé n'obtiennent de ma part qu'une suppression immédiate du compte (coucou CDiscount ! )

avatar Paquito06 | 

@jb18v

“dans le même style les sites qui t'envoient un mail parce que tu as un produit dans le panier sans l'avoir validé n'obtiennent de ma part qu'une suppression immédiate du compte (coucou CDiscount ! )”

Chrome propose cela! Tu laisses un caddie que tu as commencé a remplir et tu n’as pas finalisé l’achat, ca se met en onglet sur la homepage par defaut. Pratique ou pas 😱

avatar jb18v | 

Chrome ne me sert qu'à tester un développement, sinon pas de ça chez moi ^^

Mais pour en revenir au mail envoyé directement comme le dit l'article, c'est quand même moyen..

avatar Paquito06 | 

@jb18v

Oui bien sûr, c’est frauduleux a tous les niveaux.

avatar DrStax | 

J’ai commencer doucement à migrer vers ProtonMail et dans le même temps j’utilise et migre mes comptes via les adresses e-mail privé d’Apple et ça n’a que des avantages.

avatar frankm | 

Ça ne m’étonne pas, c’est le minimum

avatar KyVan | 

Hide My Email d’iCloud+ est limité à 100 adresses… Si vous avez besoin de plus, il y a Simple Login, service français récemment acquis par ProtonMail, pas très très cher. Et puis c’est pour notre start-up nation !

avatar koko256 | 

Je me suis souvent demandé si certains site web stockent les mots de passe erronés et surtout si l'erreur vient du fait que l'on se trompe de site (sans être du phishing car là la réponse est oui). D'aucun vont sûrement dire que cela ne leur arrive jamais grâce à leur gestionnaire de mot de passe mais dans certains cas il faut taper des identifiants à la main...

avatar jackhal | 

Je ne vois pas trop l'intérêt, à part pour constituer une liste des mots de passe les plus utilisés, par exemple. Voilà une liste (qui a probablement plutôt été constituée à partir de fuites) :
https://nordpass.com/fr/most-common-passwords-list/
J'aime beaucoup les 30ème et 81ème aux USA : "fuckyou" et "fuckyou1". On sent la création de compte obligatoire, et la sécurité renforcée par certains sites avec une erreur "Votre mot de passe doit comporter au moins un chiffre".

avatar Norandy | 

J’ai eu Tesla qui m’a fait le coup. J’avais commencé à entrer les infos de ma femme pour qu’elle fasse un essai (sans lui dire), j’ai cliqué sur suivant et je devais choisir une date. Ne sachant pas laquelle j’ai abandonné la page. 2j plus tard ma femme était contactée sur son portable.
Alors oui j’ai cliqué sur « Suivant » mais je n’ai pas cliqué sur « envoyer »

avatar marc_os | 

@ Norandy

> J’ai eu Tesla qui m’a fait le coup.

T'es-tu plaint auprès de Tesla ?

avatar Paquito06 | 

@Norandy

“J’ai eu Tesla qui m’a fait le coup. J’avais commencé à entrer les infos de ma femme pour qu’elle fasse un essai (sans lui dire), j’ai cliqué sur suivant et je devais choisir une date. Ne sachant pas laquelle j’ai abandonné la page. 2j plus tard ma femme était contactée sur son portable.
Alors oui j’ai cliqué sur « Suivant » mais je n’ai pas cliqué sur « envoyer »”

C’est tres commun ca, et assez different. En cliquant sur “Next” (certes suivant la web app), tu fais un appel serveur, tu envoies deja les informations. C’est pas a la toute fin du process, où il y a un bouton “envoyer”, que tout a ete mis en cache, et est transféré en meme temps. Dans le cas du leaky forms, avant meme de cliquer aur “next”, l’email entré dans le champs adequat est deja recuperé. Next level 😫

avatar Insomnia | 

J’ai une de mes adresses mails qui subit de plein un nombre incalculable de spam malgré les envoyer dans le dossier spam et la je comprends pas pourquoi 😒

avatar KeepAlive | 

Le fait d'envoyer de manière asynchrone au serveur des données durant la saisie ne signifie pas automatiquement qu'elles sont stockées et exploitées: comme mentionné plus haut, ça peut être justifié par une validation côté serveur qui dans certain cas ne peut pas être faite côté client, comme détection de doublon dans une base de données (choix d'un identifiant unique, etc...) ou auto-suggestion d'une valeur (saisie d'une ville, résolution de ville à partir d'un code postal).

Je suis développeur web full stack. Dans nos apps riches avec client Angular, on fait assez régulièrement de la validation en cours de saisie (avec un délai de debounce pour ne pas trop charger le serveur), ça permet d'afficher en cours de saisie un avertissement à l'utilisateur pour qu'il puisse corriger sans devoir le faire quand il est déjà arrivé tout à la fin de la saisie du form comme c'était le cas dans le formulaires du Web 1.0

CONNEXION UTILISATEUR