2010-01-27 4 views
10

Existe-t-il un équivalent à mysql_real_escape_string() pour l'injection de courrier électronique? J'ai un formulaire où l'utilisateur soumet son email. J'ai peur que quelqu'un puisse insérer une liste d'e-mails séparés par des virgules et utiliser mon site pour le spam.Fonction de validation d'e-mail PHP

+0

Poussez-le à travers this regex. –

Répondre

31

Vous pouvez utiliser filter_var pour valider l'adresse e-mail:

if (!filter_var($address, FILTER_VALIDATE_EMAIL)) { 
    // invalid e-mail address 
} 
+0

Est-ce que cela garantira qu'il n'y a qu'une seule adresse e-mail? – Brian

+0

@Brian: Oui, il retournera * false * si vous testez une chaîne comme 'user-a @ example.com, user-b @ example.com'. – Gumbo

+4

+1 pour l'utilisation d'une fonction native – Gordon

2

valident simplement le champ à une expression régulière communément trouvée pour l'adresse e-mail unique

function validate_email($e){ 
    return (bool)preg_match("`^[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$`i", trim($e)); 
} 
0

Si votre principale préoccupation est, Comme l'indique la question, pour vérifier que les utilisateurs n'ont pas tenté de vous tromper en leur envoyant une liste d'adresses séparées par des virgules, la réponse n'est-elle pas simplement de vérifier s'il existe des virgules dans l'entrée de l'utilisateur?

1

Pour ceux qui ont des versions plus anciennes

/* 
    # PHP Email Validation for versions LESS than PHP 5.2.0) 
*/ 
$strEmail= mysql_real_escape_string($_POST['email_e']); 
if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$", $strEmail)){ 

     // valid email 

     } else { 

     // not a valid email 
} 
+2

eregi est déprécié depuis PHP 5.3 – Gerfried

+0

Merci pour le commentaire. Dûment noté. – TheBlackBenzKid

0

J'ai trouvé que la bonne validation email n'est pas aussi simple que cela, si juste décidé de vérifier si « @ » et « » est dans la chaîne.

function email_valid($email){ 
    /* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "." */ 

    if(strpos($email, "@") AND strpos($email, ".")){ 
     return TRUE; 
    } 
    else { 
     return FALSE; 
    } 
} 

P.S. Si vous n'utilisez pas les instructions préparées par PDO pour écrire dans la base de données, SOYEZ SÛR de filtrer les symboles qui peuvent provoquer l'injection sql

+0

Vous pourriez au moins être sûr que le '.' la position est plus grande que le '@'. Cependant, je pense qu'il est possible de créer une meilleure validation avec l'expression regex. – patricia

+0

En fait, le courrier électronique peut même ne pas contenir de ".", Par ex."user @ hostname" dans l'intranet devrait être parfaitement utilisable – Victor

+0

@Victor c'est vrai. Après quelques années de programmation depuis que j'ai répondu à la question, je suis arrivé à la conclusion qu'il ne valait pas la peine de valider plus d'adresses email que ''. Ce qui vous intéresse, c'est si l'utilisateur peut recevoir un e-mail de votre part, ce qui peut ne pas être possible même avec une adresse e-mail valide. Il est donc plus simple d'envoyer un e-mail de confirmation plutôt que d'écrire du code de validation. – Tomas

0

Il serait plus simple de vérifier la longueur totale de la chaîne - c'est-à-dire la partie locale max 64 + le domaine @ + section max 255 caractères = 320 caractères, mais le spamming des adresses courtes serait toujours possible. Je suis actuellement à la recherche de validation par courriel pour mon projet et j'ai trouvé cet intéressant article email validation qui explique en détail les adresses e-mail valides et le rfc2822. Là, ils suggèrent une manière beaucoup plus simple de valider cela qui empêcherait les listes séparées par des virgules d'être une forme efficace de spam.

$isValid = true; 
$atIndex = strrpos($email, "@"); 
if (is_bool($atIndex) && !$atIndex) 
{ 
    $isValid = false; 
} 
else 
{ 
    $domain = substr($email, $atIndex+1); 
    $local = substr($email, 0, $atIndex); 
    // ... work with domain and local parts 
} 

Ce casse simplement l'adresse e-mail par trouver le dernier signe @ et déclare tout ce qui passe avant qu'elle soit la partie locale de l'adresse qui a une limite de 64 caractères. S'il n'y a pas de signe @ alors strrpos retournera une valeur booléenne de false. Je vais m'en servir dans ma fonction de validation.