Tester la validité d'une adresse email

La plupart des formulaires en ligne permettent de saisir une adresse de courrier électronique. Le hic, c'est que tout le monde n'applique pas la règle impérative de tout bon développeur web : vérifier le contenu des paramètres que l'on reçoit !
(cette règle simple élimine bon nombre de piratages ou détournements de sites)

Les formulaires avec email sont encore trop souvent détournés par les spammeurs pour envoyer des emails grâce à votre site.

Il suffit à l'attaquant de passer le corps du message suivi de l'adresse du destinataire dans le même champ (sans passer par la page web, le captcha éventuel, ni "subir" les contrôles du navigateur ou faits en Javascript). La fonction mail() de PHP fait ensuite l'envoi de leur message plutôt que du vôtre lorsque vous écrivez à ces destinataires, comme par exemple pour un message de confirmation de prise en compte de leur remplissage du formulaire concerné.

Cette faille a été souvent exploitée sur des formulaires de contact, de commentaires de blogs ou d'inscription à des forums.

Pour éviter ces aléas et vous retrouver spammeur sans le savoir, puis bloqué par votre hébergeur et éventuellement attaqué en justice suivant le contenu des spams envoyés par votre site, le plus sûr reste de s'assurer que l'adresse email saisie est bien une adresse email avant de la stocker ou l'utiliser.

Il y a plusieurs solutions pour ça : des expressions régulières ou des librairies/classes/frameworks de tests de paramètres typés. Pour ma part j'utilise cette simple fonction depuis un bail. Elle a été intégrée avec succès dans plusieurs outils open source victimes de ce problème.

	// check if an email adress is valid
	// return the email passed or the error message
	function emailCheck($email2)
	{
		$email = strtolower($email2);
		if (strlen($email) < 6)
		{
			return $email2." : Email trop court";
		}
		if (strlen($email) > 255)
		{
			return $email2." : Email trop long";
		}
		if (!@ereg("@",$email))
		{
			return $email2." : Le email n'a pas d'arobase (@)";
		}
		if (preg_match_all("/([^a-zA-Z0-9_\@\.\-])/i", $email, $trouve))
		{
			return $email2." :  caractère(s) interdit dans un email (".implode(", ",$trouve[0]).").";
		}
		if (!preg_match("/^([a-zA-Z0-9_]|\\-|\\.)+@(([a-zA-Z0-9_]|\\-)+\\.)+[a-zA-Z]{2,4}\$/i", $email))
		{
			return $email2." : n'est pas un email valide.";
		}
		list($compte,$domaine)=explode("@",$email,2);
		if ((function_exists("checkdnsrr")) && (!checkdnsrr($domaine,"MX")))
		{
			return $email2." : Ce domaine (".$domaine.") n'accepte pas les emails";
		}
		return $email2;
	}

Pour l'utiliser c'est tès simple: il suffit de lui passer l'adresse à contrôler en paramètre et s'assurer que c'est bien ce qui est retrourné par la fonction. Dans le cas contraire il s'agit d'un message d'erreur.

Voici un exemple de contrôle de validité d'un champ "monemail" d'un formulaire passé en POST. Bien entendu les appels à die() ici ne sont là que pour simplifier l'exemple. En pratique vous devez gérer l'erreur, la retourner à l'utilisateur ou la traiter comme bon vous semble.

	if (isset($_POST["monemail"])) {
		$email = trim($_POST["monemail"]);
		if ($email != ($erreur = emailCheck($email))) {
			die($erreur);
		}
	}
	else {
		die("email obligatoire");
	}

N'oubliez pas cette règle essentielle à tout web développeur :

Systématiquement contrôler les paramètres reçus et leur format dans les programmes qui les traitent.

Ne jamais faire confiance à la page web ou le programme appelant.