Journal d'un avocat

Instantanés de la justice et du droit

Aller au contenu | Aller au menu | Aller à la recherche

Geeks, mes frères

Je fais de nouveau appel aux bonnes volontés des codeurs qui me font l'honneur de me visiter, pour un nouveau petit problème pour le formulaire de contact de Dotclear. Le script et les instructions se trouvent ici.

Je suis sûr que le problème est d'une simplicité enfantine, enfin : pour vous.

Actuellement, le formulaire refuse comme non valides les adresses e mail dont l'extension a quatre lettres (concrètement : les adresses en .info).

Je subodore que le problème vient de cette ligne là du script qui définit ce qu'est une adresse valide :

elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,3}$",$_POST["email_expediteur"]))

Merci de vos pistes, je suis d'avance votre très humble et très reconnaissant serviteur.

PS : le problème de caractères issu de la norme UTF-8 de ce blog été résolu, merci à MadCoder, sauf pour le champ de titre de l'e mail. Si vous avez une piste, je suis preneur.

Avec votre permission, les rectifications apportées ici seront transmises à Kozlika pour que le script de base soit modifié selon vos indications.

Me voici complice objectif du logiciel libre.

Commentaires

1. Le jeudi 21 avril 2005 à 10:46 par Aiua

elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,3,4}$",$_POST["email_expediteur"]))

et voilà, ça devrait marcher, ravi d'avoir pu vous aider cher maître !
(pour info j'ai juste rajouté le 4 dans {2,3,4} )

2. Le jeudi 21 avril 2005 à 10:59 par jpgaulier

J'irai plus loin en disant :
elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,6}$",$_POST["email_expediteur"]))

Car l'expéditeur peut avoir un .museum :)

3. Le jeudi 21 avril 2005 à 10:59 par boa13

Mmm, ne serait-ce pas plutôt {2,4} ? C'est le cas dans d'autres langages, ça devrait l'être aussi dans PHP.

Par ailleurs, je remarque que les adresses email contenant un + ne sont pas supportées. Dommage (mais ça rallongerait encore l'expression).

4. Le jeudi 21 avril 2005 à 11:03 par Aiua

oui, je me suis trompé, c'est bien {2,4} (ou {2,6} donc).
Le premier chiffre représentant le nombre minimum de caractères de l'extension et le deuxième le nombre maximum.

5. Le jeudi 21 avril 2005 à 11:05 par Aiua

Dernière chose, si l'on veut prévoir l'avenir, on peut aussi ne pas limiter le nombre maximum de caractères de l'extension en mettant : {2,} (attention, la virgule est importante)

6. Le jeudi 21 avril 2005 à 11:08 par boa13

À propos d'expression à rallonge, et juste pour vous faire ouvrir de grands yeux ronds, voici l'expression qui vérifie vraiment qu'une adresse email est valide, sans simplification (c'est pour Perl, mais en PHP ça doit être similaire) :

www.ex-parrot.com/~pdw/Ma...

7. Le jeudi 21 avril 2005 à 11:08 par brio

Dites donc Maître, z'être sûr que la chasse au Geek est ouverte ? Braconnage de nerds et affutage de honey-pots hors saison, ça va vous coûter cher, tout ça !

8. Le jeudi 21 avril 2005 à 11:41 par Blaise

"somewhat pushes the limits"

Nom d'un chien, sans blague

9. Le jeudi 21 avril 2005 à 21:05 par Xiaojie

Elle est inexacte à pleins d'endroits, cette expression régulière.
Je décompose...
[0-9a-z] => commence par une lettre alphanumérique

([-_.]?[0-9a-z])* => suivi d'un nombre quelconque de fois (éventuellement nul) de
un tiret, souligné ou point (qui sont optionnels)
et une lettre alphanumérique.

Bref, le préfix a--toto ou a__toto sera refusé (le tiret, point ou souligné DOIT être suivi d'une lettre alphanum). Il vaudrait mieux mettre
[-_.0-9a-z]* à la place de ce second composant. En plus c'est plus simple.

Pour le domaine :
[0-9a-z] => idem, commence par une lettre alphanumérique
([-.]?[0-9a-z])* => suivi d'un nombre quelconque de fois
un tiret ou point (optionnels)
et d'une lettre alphanumérique.

Même motif, même punition. Le domaine (partiel) toto--est--beau
sera refusé.

Il vaudrait mieux mettre ([a-z0-9_-]+\.)* Mais la concaténation des deux blocs [0-9a-z]([a-z0-9_-]+\.)* fait que le composant le plus à gauche du nom de domaine doit obligatoirement avoir deux lettres, ce qui, de tête, n'a rien de forcé même si c'est courant (toto@a.b.c.domaine.fr est valide, sauf erreur de ma part). Si on veut faire sauter cette restriction, on modifie le biniou, qui devient :

[0-9a-z][a-z0-9_-]*\.([a-z0-9_-]+\.)*

[a-z]{2,3}$ => n'autorise que les TLD de deux ou trois lettres. Le .museum a déjà été cité, je ne sais pas si c'est le plus long aujourd'hui ou si ça sera le plus long toujours. Mettre la taille en dur semble risqué. Un [a-z]+ (suite quelconque d'au moins un caractère alpha) ou, comme quelqu'un l'a suggéré, [a-z]{2,} (suite quelconque de deux caractères alpha ou plus) serait plus approprié.

Bref, on obtient
^[0-9a-z][-_.0-9a-z]*@[0-9a-z][a-z0-9_-]*\.([a-z0-9_-]+\.)*[a-z]{2,}$

Bon courage.
-- xj


Et le pire, c'est que j'ai compris. Merci.

Eolas

10. Le vendredi 22 avril 2005 à 02:57 par wesson

Comprendre ce language est le signe d'une aliénation mentale certaine.

mais que devenez-vous mon pauvre ami ?

Le chaînon manquant entre le code napoléon et php 4.3 !

;-)

11. Le vendredi 22 avril 2005 à 21:41 par Maxime R.

«Comprendre ce language est le signe d'une aliénation mentale certaine.»

Vu mes connaissances en expressions régulières, vous seriez gentil de venir rapidemment m'interner !

(et de rendre hors la loi le livre de Jeffrey Friedl, «expressions régulières» aux éditions O'reilly).

12. Le vendredi 22 avril 2005 à 22:43 par Eolas

Pendant qu'on rédige les formulaires d'hospitalisation d'office, puis attirer votre attention sur le fait que le champ "titre" du formulaire souffre du même problème qu'autrefois le corps du message, du fait qu'il ne capte pas l'UTF-8. Y a-t-il une solution ?

13. Le dimanche 24 avril 2005 à 17:18 par vinc17

Concernant la vérification des adresses e-mail, c'est normalement plutôt aux logiciels de mail de le faire, pas aux scripts PHP (ou bien PHP devrait avoir une fonction toute faite pour cela). Ça ne sert à rien de réinventer la roue, surtout que c'est assez compliqué comme cela; par exemple, beaucoup oublient d'accepter le caractère +, très utilisé dans le temps.

Pour le problème du titre de l'e-mail, quel est le problème exactement? De manière interne, les caractères non ASCII (par exemple, les lettres accentuées) doivent être encodés. Est-ce cet encodage qui ne fonctionne pas du tout, ou est-ce juste un problème de jeu de caractères? Je ne connais pas PHP, mais ça ne m'étonnerait pas que la fonction mail() qui est utilisée dans le script ne fasse que le minimum, donc ce serait au créateur du script de se farcir tous ces problèmes d'encodage (si c'est le cas, il y a probablement d'autres fonctions de PHP qui font ça). Se renseigner sur des forums concernant PHP?


Le problème est le même que précédemment : du fait que le site est en UTF-O alors que le script semble fonctionner en ISO je sais plus combien, les caractères accentués ne passent pas. Le probleme a été régmé dans le formulaire, mais pas pour le bandeau de titre.

Eolas

14. Le lundi 25 avril 2005 à 22:32 par Maxime R.

Bingo vinc17, la fonction mail de PHP ne permet pas d'encoder les accents, c'est vraiment un simple appel à 'sendmail'...

Et à ma connaissance, il n'y a justement pas de solution simple pour résoudre ce problème. Comme pour la vérification de l'adresse email (où je suis parfaitement d'accord avec toi, et générallement de ceux a encore utiliser des '+' dans l'esprit sendmail :-) ), il n'y a rien de base pour encoder proprement le titre. Peut-être avec un peu de chance on trouvera quelque chose dans PEAR (pour perl, on dirait au CPAN), mais ca alourdirait sacrémment ce script de quelques lignes.

De toute façon j'ai découvert une autre importante faille dans ce script... Tiens, d'ailleurs ca fait 15 jours que j'ai promis de faire un texte au sujet de cette erreur bien trop courante !

15. Le lundi 25 avril 2005 à 23:41 par Maxime R.

Déjà la regex acceptant le '+' puisque déjà on en parle, et que j'y tiens :

^[0-9a-z][-_.0-9\+a-z]*@[0-9a-z][a-z0-9_-]*\.([a-z0-9_-]+\.)*[a-z]{2,}$

Evidemment, elle est loin d'être idéale vu la complexité des adresses dans la RFC822 (quelqu'un avait donné le lien vers la regex complète en Perl il me semble, et on devrait pouvoir réutiliser cette regex avec preg_match sous PHP).

Saviez-vous par exemple que, sous certaines conditions, il est possible d'avoir un espace dans une adresse mail ? (en pratique, a part les 2 ou 3 geeks qui ont lu la RFC822 ou la RFC2822, personne n'utilise de telle adresse mail).

16. Le mardi 26 avril 2005 à 00:55 par Alarc'h

Je ne sais pas si c'est suffisant mais on peut coder le sujet mail avec une fonction de ce style avant de le passer à la fonction mail() qui en effet ne s'occupe pas du tout du codage.

/* Fonction de codage du sujet du mail */
function codeSujet($sujet){
$codage = "=?iso-8859-1?q?".str_replace('%', '=',rawurlencode($sujet))."?=";
return $codage
} // Fin de fonction

17. Le mardi 26 avril 2005 à 11:00 par bartavelle

Si le but du jeu est de cacher votre email, et que le script est identique à celui présenté sur kozlika, je vous recommande de filtrer le champ "votre nom ou pseudo" pour éviter l'ajout d'en têtes supplémentaires, tels que des Cc ou des Bcc. Filtrer les caractères non affichables (\s en regexp) serait un bon début.

18. Le mardi 26 avril 2005 à 11:37 par Maxime Ritter

bartavelle : bingo, j'ai écrit l'exploit qui va bien hier soir d'ailleurs... Trop facile de spammer... Mais j'ai peur que seuls les initiés comprenennt de quoi on parle.

Alarc'h : sauf que nous sommes en UTF-8 (on aurait aussi pu rester en iso-8859-1 ou iso-8859-15, mais soyons modernes), et que le support de ce charset en PHP laissé à désirer !

Alors, en attendant que je corrige le script entier, voici déjà comment corriger le problème d'accent : j'encode le sujet en BASE64 (oui, bon, les puristes n'aiment pas faire ça, mais tant pis, le support de BASE64 en PHP ne dépends pas des hébergeurs, et j'ai pas envie de réinventer la roue).

Autrement dit, pour les pressés non-geeks, il suffit simplement de mettre, après la ligne " $entete .= "Content-Transfer-Encoding: 8bit";" :
// Encode le sujet en BASE64
$subject = "=?utf-8?B?" . base64_encode($_POST["titre"]) . "?=";

Puis, sur la ligne qui suit, transformer la fonction mail ainsi :
if (@mail($email_webmaster, $subject, $_POST["message"], $entete)){

Et voilà, les accents passent.

19. Le mardi 26 avril 2005 à 15:33 par Maxime Ritter

Et hop, voilà la version complète :
www.dotclear.net/forum/vi...

Mes logiciels, comme mes clients, sont libres. Ce blog est délibéré sous Firefox et promulgué par Dotclear.

Tous les billets de ce blog sont la propriété exclusive du maître de ces lieux. Toute reproduction (hormis une brève citation en précisant la source et l'auteur) sans l'autorisation expresse de leur auteur est interdite. Toutefois, dans le cas de reproduction à des fins pédagogiques (formation professionnelle ou enseignement), la reproduction de l'intégralité d'un billet est autorisée d'emblée, à condition bien sûr d'en préciser la source.

Vous avez trouvé ce blog grâce à

Blog hébergé par Clever-cloud.com, la force du Chouchen, la résistance du granit, la flexibilité du korrigan.

Domaine par Gandi.net, cherchez pas, y'a pas mieux.