OVH Cloud OVH Cloud

[debutant] fonction mail et express ions regulieres et securite

3 réponses
Avatar
Tasgarth
Bonjour,
Dans un formulaire ,par sécurité je désire 'filtrer' les différents
champs et controler la validité des adresses mails reçues...
Bon (?) élève, j'ai lu ce qui est dans la FAQ du News et un peu dans les
archives, concernant la sécurité... J'ai donc écrit un script en
utilisant les modèles données et fais divers essais pour tester en local
(Wampserver et php5).
exemple 1 :
"/^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*.([a-z]{2,4})$/""/^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*.([a-z]{2,4})$/"
exemple 2 :
":^[.A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]+@[.A-Za-z0-9-]+$:"
exemple 3 :
"/^[.A-Za-z0-9+_-]+@[.A-Za-z0-9-]+$/"

1ere constatation :
il me semblerait que le filtrage par '[[:alnum:]]' est plus efficace que
par 'A-Za-z0-9' ? Juste? Faux ?... J'ai fais un essai en mettent un '+'
dans l'adresse.
Dans exemple 1 l'adresse est rejetée mais pas pour les cas 2 et 3.

2 ieme constat : si j'intercale une chaine commençant par '$'( $nuisible
), l'adresse est ACCEPTEE mais la chaine '$nuisible' disparait après
filtre, $nuisible semblant etre interprétée comme une variable (null ?)
et passe le filtre...
Ma question : comment rejeter une adresse contenant '$' et où est l'erreur ?
Merci pour des conseils.

Mon script de test avec la fonction mail():

$email ="adresse.a+aa@tondoma$nuisible.fr";

// Exemple 1
if(preg_match("/^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*.([a-z]{2,4})$/",
$email))
{
// Si le mail est correct, envoi du mail
echo "<h2> Exemple 1. email correct : " , $email , "</h2>";
}
else
{
// Si le mail n'est pas correct
echo '<h3> Exemple 1. Email incorrect :</h3>' , $email, "</h2>";
}
// Exemple 2
$pattern = ':^[.A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]+@[.A-Za-z0-9-]+$:';
if (preg_match($pattern, $email))
{
// Si le mail est correct, envoi du mail par mail()

echo "<h3> Exemple 2 email correct : " , $email , "</h2>";
}
else
{
// Si le mail n'est pas correct
echo '<h3> Exemple 2 Email incorrect</h2>' , $email;
}
// Exemple 3
$pattern = '/^[.A-Za-z0-9+_-]+@[.A-Za-z0-9-]+$/';
if (preg_match($pattern, $email))
{
// Si le mail est correct, envoi du mail par mail()
echo "<h3> Exemple 3. email correct : " , $email , "</h2>";
}
else
{
// Si le mail n'est pas correct mail()
echo '<h3> Exemple 3 Email incorrect</h2>' , $email;
}


---
Antivirus avast! : message Sortant sain.
Base de donnees virale (VPS) : 0635-4, 01/09/2006
Analyse le : 04/09/2006 14:12:19
avast! - copyright (c) 1988-2006 ALWIL Software.
http://www.avast.com

3 réponses

Avatar
Olivier Miakinen

Dans un formulaire ,par sécurité je désire 'filtrer' les différents
champs et controler la validité des adresses mails reçues...
Bon (?) élève, j'ai lu ce qui est dans la FAQ du News


;-)

exemple 1 :
"/^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*.([a-z]{2,4})$/""/^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*.([a-z]{2,4})$/"
exemple 2 :
":^[.A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+@[.A-Za-z0-9-]+$:"
exemple 3 :
"/^[.A-Za-z0-9+_-]+@[.A-Za-z0-9-]+$/"

1ere constatation :
il me semblerait que le filtrage par '[[:alnum:]]' est plus efficace que
par 'A-Za-z0-9' ? Juste? Faux ?...


Ben non, à ma connaissance c'est censé être la même chose. Selon la
locale, ça pourrait même être l'inverse si jamais une implémentation
acceptait des « à », des « ç » ou de « ñ » en tant que caractères
alphabétiques.

J'ai fais un essai en mettent un '+' dans l'adresse.
Dans exemple 1 l'adresse est rejetée mais pas pour les cas 2 et 3.


Évidemment ! Parce que dans l'exemple (à proscrire) numéro 1 tu
n'acceptes que les caractères alphanumériques, alors que dans le 2 tu
acceptes tous les caractères valides pour une adresse de courriel, et
que le 3 est un intermédiaire entre 1 et 2.

2 ieme constat : si j'intercale une chaine commençant par '$'( $nuisible
), l'adresse est ACCEPTEE mais la chaine '$nuisible' disparait après
filtre, $nuisible semblant etre interprétée comme une variable (null ?)
et passe le filtre...


Ça ce n'est pas dans la FAQ, mais dans les premières pages du manuel.

Ma question : comment rejeter une adresse contenant '$'


Pourquoi rejeter une adresse contenant '$', au fait ? C'est à priori
valide. Mais sinon, tu peux utiliser l'exemple 3.

et où est l'erreur ?
Merci pour des conseils.


http://www.php.net/manual/fr/language.types.string.php
Utiliser des guillemets simples.

// Exemple 2
$pattern = ':^[.A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+@[.A-Za-z0-9-]+$:';


Pourtant, tu as bien des guillemets simples ici. Ça ne marche pas ?

---
Antivirus avast! : message Sortant sain.
Base de donnees virale (VPS) : 0635-4, 01/09/2006
Analyse le : 04/09/2006 14:12:19
avast! - copyright (c) 1988-2006 ALWIL Software.
http://www.avast.com


Beurk. Vire ça si tu peux, ça ne sert à rien. D'une part parce que les
articles sur usenet-fr sont en texte, donc sans virus, et d'autre part
parce que n'importe qui envoyant un virus pourrait mettre ces six lignes
à la fin du message.

Avatar
Olivier Miakinen
Le 04/09/2006 18:53, je répondais à Tasgarth :

il me semblerait que le filtrage par '[[:alnum:]]' est plus efficace que
par 'A-Za-z0-9' ? Juste? Faux ?...


Ben non, à ma connaissance c'est censé être la même chose. [...]


Pour être précis, c'est '[[:alnum:]]' et '[A-Za-z0-9]' (et non pas
'A-Za-z0-9')


Avatar
Tasgarth
merci d'avoir analyser en détails mon topic et je te remercie de tes
remarques et conseils précis.
Cela m' a permis de remonter à la source et de retrouver l'erreur
grossière à la base de mes constatations... fausses !!
:
la fonction preg_match($pattern, $email) ne retourne qu'un bool (false
ou true) et non pas .... une chaine filtrée!!
C'est différent d'un ereg_replace() qui retourne un string...
J'avais fait le 'transfert' de 'ereg' vers 'preg_match'.
Pour les guillemets c'est OK et pour la signature de l'antivirus je vais
voir cela de plus près..
merci.


---
Antivirus avast! : message Sortant sain.
Base de donnees virale (VPS) : 0635-5, 04/09/2006
Analyse le : 05/09/2006 17:36:33
avast! - copyright (c) 1988-2006 ALWIL Software.
http://www.avast.com