Je commencerai par dédicacer ce premier billet de l'année aux intrépides qui estiment pouvoir coder eux-mêmes leur algorithme de validation syntaxique d'adresses e-mail sans lire le sacro-saint RFC 2822, le document définissant ce qu'est une adresse e-mail valable.

Ceux qui ont vu mes informations de contact sur mon blog se sont sûrement aperçus que j'utilise un caractère inhabituel dans mon adresse mail : le signe « plus ».

Pour moi, cela me sert à créer des « alias » ad hoc, qui sont automatiquement redirigés vers mon adresse principale sans avoir à toucher à un quelconque fichier de configuration de Postfix. Ces alias me servent ensuite à trier mes mails plus efficacement (y compris pour les mettre directement à la poubelle lorsqu'un organisme abuse de mes coordonnées pour m'envoyer du spam).

Il m'est ensuite bien plus facile de créer des règles de tri fondées sur l'adresse e-mail du destinataire (ce destinataire étant l'un de ces nombreux alias) plutôt que sur des critères moins fiables. Certains fournisseurs, comme GMail, proposent également la même fonctionnalité.

RFC 2822, une lecture indispensable

La RFC 2822 (§ 3.2.4) donne la liste des caractères acceptables dans une adresse e-mail, mis à part le "@" qui sert de séparateur : tout caractère alphanumérique, mais aussi les symboles "!", "#", "$", "%", "&", "'" (apostrophe), "*", "+", "-", "/", "=", "?", "^", "_", "`" (backtick), "{", "|", "}", "~". Le point est aussi accepté, sauf en début ou en fin de chaîne de caractère.

Cela signifie donc qu'une adresse comme « !&'}.|`?@example.com » est tout à fait valable et que tous ceux qui rejettent cette adresse e-mail violent la RFC 2822. Je dispose d'une liste croissante de sociétés, dont des FAI (voyez l'ironie) et des banques, qui rejettent mes adresses contenant juste un « plus ». C'est consternant, car des bibliothèques faisant cette validation syntaxique cor­rec­tement existent déjà et qu'il est donc parfaitement inutile de réinventer une roue carrée.

Un petit plus qui casse tout

Maintenant que j'ai fait cette petite parenthèse sur tous les caractères qu'on peut mettre dans une adresse mail, revenons au sujet. L'histoire remonte à l'an dernier. À cause d'un mauvais algorithme de validation d'adresses e-mail et d'une ribambelle d'autres bugs, j'ai en effet réussi à "casser" le site moncompteformation.gouv.fr d'une façon que je n'aurais jamais cru possible.

J'ai voulu créer mon compte en remplissant le formulaire, où l'on demande : numéro de Sécurité sociale, nom, prénom, adresse e-mail et d'autres joyeusetés. Ce faisant, j'ai pris soin de saisir une adresse e-mail avec comme partie utilisateur « x0r+cpf ».

Je valide. Le formulaire passe. Mon adresse e-mail est acceptée et on me laisse donc passer à l'étape suivante, qui consiste à choisir un mot de passe. Je valide. Et là, erreur : impossible de créer le compte car mon adresse e-mail n'est pas valable.

Je me demande pourquoi cette validation ne s'est pas faite directement après avoir soumis le premier formulaire. Je reviens donc en arrière, en maugréant et en ajoutant un alias à la main dans la configuration Postfix ; je substitue alors un point au caractère plus dans mon adresse, ce qui devrait théoriquement passer.

Et là, nouvelle erreur : il existe déjà un compte avec ce numéro de Sécurité sociale.

Pourtant, c'est impossible : on m'avait pourtant dit que le compte ne pouvait pas être créé car « x0r+cpf » n'était pas valable. Je n'ai même pas reçu d'e-mail de confirmation. Il y avait bien eu un mail, en fait, d'après les logs de Postfix, mais il a dû se faire manger par SpamAssassin : un collègue m'a confirmé que le mail de confirmation était envoyé depuis une machine sans reverse DNS, ce qui va à l'encontre des bonnes pratiques. Étant donné que les spammeurs envoient souvent leurs spams depuis des machines sans reverse DNS, ce genre de messages finira dans les dossiers « Spams » à coup sûr chez beaucoup de monde.

Conclusion : je me retrouve avec un compte à moitié créé, auquel je n'ai pas accès car le mot de passe n'a jamais pu être défini pour ce compte. La base de données utilisant visiblement le numéro de Sécurité sociale comme clé primaire, il m'était impossible de recommencer.

La valse des analyseurs syntaxiques en mousse

La page de contact du site donne l'adresse e-mail du webmaster, que je m'empresse de contacter afin de lui expliquer les faits que je viens d'évoquer, et que je me retrouve du coup avec un compte inexploitable. En pensant que la plupart des clients e-mail de nos jours géreraient mon adresse correctement, je mets « x0r+cpf » dans le champ From. J'envoie.

Mes logs Postfix montrent ensuite que quelqu'un, ou un robot, a alors essayé d'envoyer un message à... « cpf ».

Non seulement ils valident mal les adresses, non seulement leurs machines n'ont pas de reverse DNS, mais quelqu'un ou quelque chose parvenait encore, en 2015, à mal extraire l'adresse e-mail du champ "From" d'un mail. L'e-mail tel qu'on le connaît existe pourtant depuis 1982.

Je crée donc encore un alias pour que les messages adressés à l'utilisateur « cpf » ne finissent pas à la cyber-poubelle, et je renvoie un deuxième mail pour informer le webmaster du dysfonctionnement. Même adresse From que le mail précédent, et même réponse sur la mauvaise adresse : c'était en fait un mail de confirmation envoyé par un robot d'une plate-forme d'e-mails destinée aux entreprises.

Enfin, à mon premier mail, je reçois en réponse un message à côté de la plaque me conseillant de faire des choses que j'avais déjà essayées : à savoir, m'inscrire, réinitialiser mon mot de passe, et ainsi de suite. J'avais pourtant déjà dit que j'avais essayé tout cela avant d'envoyer mon mail au webmaster.

En fin de compte, c'est seulement en décrochant le bon vieux téléphone (ou un téléphone IP chez moi, donc pas vraiment "bon vieux", certes) et en appelant le support technique que j'ai plus ou moins réussi à résoudre le problème : mon interlocutrice a su défaire cette tentative de création de compte qui avait échoué, puis tout a fini par rentrer dans l'ordre. Mais malheureusement sans caractère plus dans l'adresse e-mail.

Conclusion

Ce genre de situations montre bien ce à quoi peut aboutir plusieurs « petits » problèmes, qui, mis bout à bout, entraînent des résultats potentiellement catastrophiques :

un algorithme de validation syntaxique d'adresses e-mail non conforme à la RFC 2822 ;

une configuration de zone DNS non conforme aux bonnes pratiques (i.e. enregistrements PTR manquants pour les serveurs mail sortants) ;

un processus de création de compte non atomique ;

enfin, une plateforme e-mail de support technique buguée.

Ce qui me choque est surtout le fait que la création de compte ne soit pas atomique. L'atomicité signifie qu'à la fin, on a soit un compte parfaitement créé, soit rien du tout. Je vois d'ailleurs mal comment quelque chose d'aussi simple que l'ajout d'un seul tuple dans une seule table peut échouer de manière aussi catastrophique.

En fin de compte, si on dit que le développement informatique est le BTP des temps modernes, j'ai bien peur qu'on finira par être entouré de châteaux de cartes. Y compris dans le service public.