Vérification format adresse email

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Vérification format adresse email

par AB » 21 juil. 2009, 22:09

Alors ça y est ?

En reprenant ton ancien code cela pourrait donner
<?php

if(isset($_POST['nom'])) { // Si on envoie le formulaire

// Connexion à la base de données "externalisation"
mysql_connect("localhost", "root");
mysql_select_db("externalisation");

// On récupère les $_POST et on en fait des variables
$_POST = array_map('mysql_real_escape_string', $_POST); // on applique mysql_real_escape_string sur tout le tableau $_POST
$nom = $_POST['nom'];
$mot_de_passe = $_POST['mot_de_passe'];
$email = $_POST['email'];
$datetime = date('Y-m-d') .' '. date('H:i:s');

$resultat = null;//initialisation à null de la variable $resultat qui renvoi l'état de l'exécution de la requête d'insertion


//Vérification de l'email
$retour = filter_var($email, FILTER_VALIDATE_EMAIL); 

if($retour)
{ 
     

// On crypte le mot de passe
define('PREFIXE_SHA1', 'p8%B;Qdf78');

$mdp_sha1  = $_POST['mot_de_passe'];

$mdp_sha1 = sha1(PREFIXE_SHA1.$mdp_sha1);

// On part du principe que le nom d'utilisateur est unique, on doit vérifier qu'il n'existe pas déjà ans la table
$requete = "SELECT COUNT(*) AS nb FROM formulaire WHERE utilisateur = '". $nom ."'"; // On crée la requête
$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // On exécute la requête
$donnees = mysql_fetch_array($resultat); // On crée un tableau pour récupérer la valeur que renvoie la requête
$nombre = $donnees['nb']; // On crée une variable qui contiendra le nombre de résultats renvoyé par la requête

    if($nombre == 0) 
   { // Si la variable renvoie 0 c'est que le nom d'utilisateur n'existe pas dans la table donc on peut l'enregistrer
    $requete = "INSERT INTO formulaire VALUES('". $nom ."', '". $mdp_sha1  ."', 1, '". $datetime ."', '". $email ."')";
    $resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // on exécute la requête
    
    
// On crée le message email
$msg1 = 'Merci pour votre inscription et bienvenue sur le site ! Votre identifiant est '. $nom .' et votre mot de passe est '. $mot_de_passe; //Message pour le nouveau membre 
$msg2 = 'Un nouveau membre s\'est inscrit: '. $nom;  //Message pour le webmaster

$recipient = '[email protected]'; //Adresse mail du webmaster
ini_set("sendmail_from",$recipient);
$subject = 'Formulaire d\'inscription'; //On met le sujet du mail

$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$header .= "From:  ". $email ."";


    $mail1 = mail($recipient, $subject, $msg2, $header); //Mail envoyé au webmaster 
    $mail2 = mail($email, $subject, $msg1, $header); //Mail envoyé au nouveau membre
        if($mail1 && $mail2) 
       {
        echo 'Vous allez recevoir un mail avec vos informations.';
        } 
        else 
       {
        echo 'Erreur dans l\'envoi du mail .';
        }
    } 
   else 
   { 
   // Sinon ce nom existe déjà, on insert aucune donnée
    echo 'L\'utilisateur '. $nom .' existe déjà. Veuillez vous réinscrire sous un autre nom d\' utilisateur.';
    }

}
else
{
// Sinon ce mail n'est pas valide, on insert aucune donnée
   echo 'Votre adresse email est invalide. Veuillez la vérifier';
}
mysql_close(); // On ferme la connexion

if (isset($resultat)) echo 'Enregistrement effectué. Vous êtes maintenant inscrit. Merci !<br />'; 
}

?>
J'ai déplacé le message de confirmation pour qu'il n'y ait pas de conflit avec les header car on ne peut pas envoyer un header après un echo (sauf à enclencher une bufférisation mais tant qu'on peux l'éviter c'est préférable).

par thehawk » 21 juil. 2009, 20:40

Re cindy , je te prend pas pour un potiche :langue: mais quand même 8-)

J'ai expliquer dans un message précédent le fonctionnement du flag.
Donc enfaite pas besoin de lui dire qu'il y a un @ et tout et tout , toutes l'astuce vient du flag.

Les développeurs ont passé un temps certain (voir un certain temps) a developper une expression régulière (regex) pour déterminer dans la validité d'une adresse e-mail , et l'on placé dans le swtich du flag (cf. un de mes précédent post), ensuite une fois la regex trouvé il l'applique a ton adresse email, et en fonction du résultat de la comparaison , retourne une valeur booléenne (true or false) a la fonction filter_var.

Pour généraliser la chose, tu met la pastèque (l'adresse email) dans le mixer (filter_var) et regarde s'il sort du jus ou de la pulpe

On peut dire que c'est une fonction que l'on peu traduire par :
"Est ce que ma valeur textuelle (string) est une adresse email ?" et la fonction te répond oui ou non.

et apres on test si oui ou non ^^, la je pense pas pouvoir expliquer mieux :(

Comme la effectivement souligné AB le code que j'ai fourni est un prémice de code, en effet je ne savais pas quel traitement tu voulais effectué à a savoir simplement afficher un texte comme quoi l'adresse était invalide avec un formulaire pré-remplis ensuite , redirigé l'utilisateur vers une autre page de ton site pour lui dire que c'est un boulet et qu'il doit recommencer etc.

J'ai mit l'instruction exit; pour simplement stopper le cheminement du code , car tous simplement tu envoi le mail sans tenir compte de ta vérification d'émail.


Voila bonne chance pour la suite
bonne soirée Hawk

par AB » 21 juil. 2009, 18:47

Attention !
Dans ton code précédent la variable $recipient contient une adresse email.
J'espère que c'est factice sinon tu vas te faire spammer.
Sinon dépêches-toi d'éditer ton précédent message pour la modifier ou la supprimer :wink:

Sinon pour compléter un peu l'exemple de thehawk
$retour = filter_var($email, FILTER_VALIDATE_EMAIL); 

if(!$retour){ 
                        // Ici va venir le code a faire dans le cas que c'est pas bon
exit; // On stop le traitement , donc pas d'insertion dans la base , pas de mail envoyer a une adresse fausse etc

} 
avant le "exit;" je verrais bien une redirection avec un header vers la page appelante avec le passage d'une variable qui permettrait d'afficher un petit message d'erreur de mail pour le visiteur.

A part ça je trouve que tu t'embêtes un peu pour un si petit script, à faire une page séparée pour le formulaire et le code de traitement.

par Cindy80s » 21 juil. 2009, 18:38

Est-ce que vous auriez un lien vers une sorte de cours sur "FILTER_VALIDATE_EMAIL" parce que je n'y arrive franchement pas ! Je vois où mettre le code, je sais ce qu'il faut lui faire dire mais je n'arrive pas du tout à retranscrire ça et je trouve rien d'expliquer clairement sur Google.

Donc en fait j'en suis là :
<?php
//Vérification de l'email
$retour = filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 

if($retour){ 
     echo "Adresse Valide ! "; //Si l'email est correct
} 

else(!$retour){  
                        // Si l'email est incorrect 
exit; 

} 
?>
Je sais pas comment lui faire dire qu'il faut qu'il vérifie qu'il y ait bien un "@", un nom de domaine derrière ... Et que si c'est pas le cas il faut qu'il envoie l'utilisateur balader ...

Vous devez me trouver bien potiche et je crois que vous avez plutôt raison :lol:

par albat » 21 juil. 2009, 18:23

Modération :
Thehawk, évite de me réveiller en sursaut quand ce n'est pas encore le moment. :evil:

C'est vrai, enfin... J'ai l'air de quoi, moi, maintenant ?...
:?

par Cindy80s » 21 juil. 2009, 18:14

Mon problème n'est pas encore résolu ! Je suis justement en train d'y travailler là ! Je pensais le mettre en résolu une fois que je n'aurai vraiment plus aucune question en fait :oops:

par thehawk » 19 juil. 2009, 17:21

:agenouille: Albat²

:langue:

par albat » 19 juil. 2009, 17:03

Ooooooh, thehawk, tu m'enlèves tout mon plaisir de modérateur sadique... :x |(X

Allez, Cindy, amène tes doigts ! :twisted: :axe:

Modération :
Cindy80s, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

par thehawk » 19 juil. 2009, 16:59

N'oublie pas le bouton "Résolu" si ton soucis est résolu , sinon tu va te faire taper sur les doigts ;)

par Cindy80s » 19 juil. 2009, 16:06

Merci pour toutes vos précisions !!!
Je vais essayer d'arranger mon code par rapport à vos critiques .
Maintenant je vois bien précisement ce qui ne va pas :D
MERCI :wink:

par thehawk » 19 juil. 2009, 15:22

J'ai pas vu :oops: ^^'


Alors au niveau du code , en gros tu as fait un bon truc ^^ manque juste 2 petites choses :roll:

La 1ere , tu affiche que l'email est bonne ... mais bon tous les emails ne sont pas '[email protected]'.
Adapte a ton script quand meme on ne fait du CPE (i.e Code Pret à L'emploi :langue: ).

la 2ème chose on fait quoi si le mail est pas bon ? on fait tout les traitements quand même ? :non2:


je verrais plus quelques choses du stye :
$retour = filter_var($email, FILTER_VALIDATE_EMAIL); 

if(!$retour){ 
                        // Ici va venir le code a faire dans le cas que c'est pas bon
exit; // On stop le traitement , donc pas d'insertion dans la base , pas de mail envoyer a une adresse fausse etc

} 
Donc pour adapter a ton script , remplace la portion de code.

Et au niveau de la ligne : '// Ici va venir le code a faire dans le cas que c'est pas bon'
Tu met ton code pour traiter le cas où l'email entrée est pas bonne !!!
Le code devra être avant le exit; (qui mettra fin au script)

Bonne aprem' Hawk

par orgerix » 19 juil. 2009, 15:01

thehawk, elle a fait un map du tableau POST donc c'est bon ;)

par Cindy80s » 19 juil. 2009, 14:56

Ok merci . Bon du coup j'ai inséré le code de stopher dans ma page de code ( je rappelle qu'à la base j 'ai une page en html avec mon formulaire et une autre page qui permet de traiter l'envoi dans la BDD, et c'est cette dernière page dont je parle ici ) et ça ne marche pas pour autant . Quant à la "function mysql_escape_string();" elle apparaît également dans mon code ...
Et finalement je ne comprends pas d'où vient mon erreur, malgrè le fait que j'ai à peu près compris tout ce que tu t'acharnes à m'expliquer depuis tout à l'heure :lol:

Voici mon code PHP, pourrais-tu y jeter un coup d'oeil s'il te plaît ? :oops:

<?php

if(isset($_POST['nom'])) { // Si on envoie le formulaire

// Connexion à la base de données "externalisation"
mysql_connect("localhost", "root");
mysql_select_db("externalisation");

// On récupère les $_POST et on en fait des variables
$_POST = array_map('mysql_real_escape_string', $_POST); // on applique mysql_real_escape_string sur tout le tableau $_POST
$nom = $_POST['nom'];
$mot_de_passe = $_POST['mot_de_passe'];
$email = $_POST['email'];
$datetime = date('Y-m-d') .' '. date('H:i:s');

//Vérification de l'email
$retour = filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 

if($retour){ 
     echo "Adresse Valide ! "; 
} 

// On crypte le mot de passe
define('PREFIXE_SHA1', 'p8%B;Qdf78');

$mdp_sha1  = $_POST['mot_de_passe'];

$mdp_sha1 = sha1(PREFIXE_SHA1.$mdp_sha1);

// On part du principe que le nom d'utilisateur est unique, on doit vérifier qu'il n'existe pas déjà ans la table
$requete = "SELECT COUNT(*) AS nb FROM formulaire WHERE utilisateur = '". $nom ."'"; // On crée la requête
$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // On exécute la requête
$donnees = mysql_fetch_array($resultat); // On crée un tableau pour récupérer la valeur que renvoie la requête
$nombre = $donnees['nb']; // On crée une variable qui contiendra le nombre de résultats renvoyé par la requête

	if($nombre == 0) { // Si la variable renvoie 0 c'est que le nom d'utilisateur n'existe pas dans la table donc on peut l'enregistrer
	$requete = "INSERT INTO formulaire VALUES('". $nom ."', '". $mdp_sha1  ."', 1, '". $datetime ."', '". $email ."')";
	$resultat = mysql_query($requete) or die('ERREUR SQL : '. $requete . mysql_error()); // on exécute la requête
	echo 'Enregistrement effectué. Vous êtes maintenant inscrit. Merci !<br />';
	
// On crée le message email
$msg1 = 'Merci pour votre inscription et bienvenue sur le site ! Votre identifiant est '. $nom .' et votre mot de passe est '. $mot_de_passe; //Message pour le nouveau membre 
$msg2 = 'Un nouveau membre s\'est inscrit: '. $nom;  //Message pour le webmaster

$recipient = '[email protected]'; //Adresse mail du webmaster
ini_set("sendmail_from",$recipient);
$subject = 'Formulaire d\'inscription'; //On met le sujet du mail

$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$header .= "From:  ". $email ."";


	$mail1 = mail($recipient, $subject, $msg2, $header); //Mail envoyé au webmaster 
	$mail2 = mail($email, $subject, $msg1, $header); //Mail envoyé au nouveau membre
		if($mail1 && $mail2 == true) {
		echo 'Vous allez recevoir un mail avec vos informations.';
		} else {
		echo 'Erreur dans l\'envoi du mail .';
		}
	} else { // Sinon ce nom existe déjà, on insert aucune donnée
	echo 'L\'utilisateur '. $nom .' existe déjà. Veuillez vous réinscrire sous un autre nom d\' utilisateur.';
	}

mysql_close(); // On ferme la connexion
}

?>	

par thehawk » 19 juil. 2009, 14:36

en gros on peux généraliser en mon sens l'action du flag comme ceci :
function filter_var($string , $flag)
{
	switch ($flag)
	{
		case FILTER_VALIDATE_EMAIL:
			if (preg ........)
			return true
			else
			return false
			break;
		case 
		
		/*
			Etc
		
		*/
	
	}
}

C'est juste pour t'aider a te montrer comment je me le représente :) , la source doit être plus compliqué et surement pas en PHP :p

Ensuite au niveau de la source de stropher , je pense en effet qu'au niveau de la verification de la validité synataxique de la variable c'est correct.

Apres avant tout insertion dans une base de donnée il faudrait que chaque variable venant d'un formulaire (i.e toutes informations saisies par un utilisateur) , soit encadrer par la function mysql_escape_string();

Bye Hawk.

par Cindy80s » 19 juil. 2009, 14:26

Okkk d'accord merci 8-) Je pense que j'ai compris .
En gros le flag contient toutes les conditions qui font qu'un email est valide .
C'est bien ça ?

Et au niveau du code qu'on m'a proposé il est complet donc ? Ou alors je dois le remodifier, le completer ?