2010-01-27 15 views
10

¿Hay un equivalente a mysql_real_escape_string() para inyección de correo electrónico? Tengo un formulario donde el usuario envía su correo electrónico. Me temo que alguien podría insertar una lista de correos separados por comas y usar mi sitio para enviar spam.PHP función de validación de correo electrónico

+0

Extiéndalo a través de this regex. –

Respuesta

31

Puede utilizar filter_var para validar la dirección de correo electrónico:

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

¿Eso garantizará que solo haya una dirección de correo electrónico? – Brian

+0

@Brian: Sí, devolverá * false * si prueba una cadena como 'user-a @ example.com, user-b @ example.com'. – Gumbo

+4

+1 para usar una función nativa – Gordon

2

simplemente validar el campo con una expresión regular que se encuentra comúnmente dirección de correo electrónico única

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 su principal preocupación es, como dice la pregunta, para verificar que los usuarios no hayan intentado engañarte para que envíen spam para ellos ingresando una lista de direcciones separadas por comas, ¿entonces no es la respuesta obvia simplemente verificar si hay comas en la entrada del usuario?

1

Para aquellos con versiones anteriores

/* 
    # 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 se depreció desde PHP 5.3 – Gerfried

+0

Gracias por el comentario. Dully señaló. – TheBlackBenzKid

0

He encontrado que la buena validación de correo electrónico no es tan simple, por lo que sólo decidió comprobar si "@" y "" está en la cadena.

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 no utiliza declaraciones preparadas PDO para escribir en la base de datos, ASEGÚRESE de filtrar los símbolos que pueden causar la inyección sql

+0

Al menos podría estar seguro de que el '.' la posición es más grande que la '@'. Aún así, creo que es posible crear una mejor validación con la expresión de expresiones regulares. – patricia

+0

En realidad, el correo electrónico puede incluso no contener un ".", P."user @ hostname" en la intranet debe ser perfectamente utilizable – Victor

+0

@Victor eso es cierto. Después de algunos años de programación desde que contesté originalmente la pregunta, llegué a la conclusión de que no vale la pena validar las direcciones de correo electrónico más que ''. Lo que le importa es si el usuario puede recibir un correo electrónico de usted, que podría no ser posible incluso con una dirección de correo electrónico válida, por lo que es mucho más simple enviar un correo electrónico de confirmación en lugar de escribir un código de validación. – Tomas

0

Sería más sencillo verificar la longitud total de la cadena, es decir, la parte local max 64 + el dominio @ + la sección tiene un máximo de 255 caracteres = 320 caracteres, pero luego las direcciones cortas de correo no deseado todavía serían posibles. Actualmente estoy investigando la validación de correo electrónico para mi proyecto y encontré este interesante artículo email validation que explica en profundidad las direcciones de correo electrónico válidas y el rfc2822. Allí sugieren una forma mucho más simple de validación que evitaría que las listas separadas por comas fueran una forma efectiva de correo no deseado.

$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 
} 

Esto simplemente rompe la dirección de correo electrónico abajo encontrando el último signo @ y declara todo lo que pasa antes de que sea la parte local de la dirección que tiene un límite de 64 caracteres. Si no hay un signo @, strrpos devolverá un valor bolean de falso. Voy a hacer uso de esto en mi función de validación.

Cuestiones relacionadas