validacion - validar email php mysql
¿Debo usar filter_var para validar el correo electrónico? (5)
Tengo una clase que valida cada entrada antes de enviarla a la capa de la base de datos. Tenga en cuenta que mi problema no es escapar o nada. Mi capa de base de datos manejará el problema de Inyección de SQL. Todo lo que quiero hacer es validar si el correo electrónico es válido o no, porque más tarde ese correo electrónico podría ser utilizado como un ''enviar a''. Por ejemplo, el usuario recuperará el acceso a su cuenta a través de un enlace enviado al correo electrónico. He leído mucho sobre filter_var
y hay muchas personas que están en contra y otros están a favor. Manteniendo el foco en ''Solo quiero validar el correo electrónico y no filtrarlo para la base de datos o para html o XSS o lo que sea'', ¿hay algún problema al usar filter_var
?
Sí. Pero checkdnsrr()
también puede valer una mención aquí.
filter_var()
aprobará dominios que parecen estar incompletos porque podrían ser válidos en un contexto local (por ejemplo, alguien @ localhost). Esto puede conducir a falsos positivos donde las personas simplemente pierden el TLD o el punto en el nombre de dominio (por ejemplo, hattie.jacques@gmailcom)
checkdnsrr()
estos haciendo una búsqueda de checkdnsrr()
en el dominio: si puede encontrar un registro MX para el dominio y la dirección es válida, entonces prácticamente ha hecho su mejor checkdnsrr()
.
Código de ejemplo:
if(filter_var($email, FILTER_VALIDATE_EMAIL))
{
list($userName, $mailDomain) = explode("@", $email);
if (!checkdnsrr($mailDomain, "MX"))
{
// Email is unreachable.
}
}
else
{
// Email is bad.
}
checkdnsrr()
es bastante instantáneo (en mi experiencia) y aún no he encontrado un entorno en el que no funcione.
Si deberías.
El uso de la validación estándar de la biblioteca en lugar de una receta casera tiene múltiples beneficios:
- Muchos ojos ya vieron el código (bueno, al menos dos) que utilizará, con suerte con experiencia en validación de correo electrónico, incluso antes de fusionarse en un lanzamiento.
- Está probado en una unidad .
- Otras personas usarán el mismo cheque e informarán errores y obtendrás estas soluciones de forma gratuita en las actualizaciones de php.
Sin embargo, consultar el formato de una dirección de correo electrónico es solo la primera línea de defensa, si realmente quiere saber si es real o no, tendrá que enviarle un mensaje.
Sí, debes usar filter_var
y así es como puedes incorporarlo:
if( filter_var( $email ,FILTER_VALIDATE_EMAIL ) )
{
/*
* Rest of your code
*/
}
Desafortunadamente, filter_var
no es compatible con UTF8 en la parte local (antes del @) de la dirección, y para admitir nombres de dominio internacionales necesitará ejecutar el nombre de dominio a través de idn_to_ascii
por separado (lo cual es una molestia y no es obvio).
Esto hace que filter_var
sea bastante inútil en mi opinión: filter_var
más direcciones de correo electrónico unicode aparezcan en la naturaleza, más direcciones de correo electrónico legítimas fallarán, especialmente en países como China o Brasil, donde existe una demanda obvia de estas direcciones. filter_var
tampoco permite direcciones de correo electrónico como root@localhost
, que son válidas y pueden ser útiles en un contexto de servidor.
Sería realmente útil si existiera una biblioteca de correo electrónico para validar de acuerdo con instrucciones específicas: ¿solo se permiten nombres de dominio, o también hosts arbitrarios como localhost, o existe una lista blanca para dominios personalizados que debería ser válida? ¿Debería permitirse unicode? ¿Cuáles son los errores tipográficos comunes para los nombres de dominio de correo gratuito (como @ homail.com) que también deberían fallar?
Además, validar algunos nombres de dominio de manera más específica sería sensato: hotmail.com no permite caracteres unicode por ahora y tiene limitaciones específicas sobre los caracteres utilizables. Como la mayoría de las direcciones de correo electrónico usadas en aplicaciones PHP se concentran en aproximadamente 100 dominios diferentes, esto podría usarse para validar estos nombres de dominio de una mejor manera. Lamentablemente, no existe tal biblioteca todavía, hasta donde yo sé.
Algunos de los comentarios que vi no coincidían con mis pruebas, así que quería señalar la funcionalidad que encontré con PHP 5.x. Si primero SANITIZA el correo electrónico, eliminará todos los caracteres que no desea, entonces puede VALIRLO. Tengo dos funciones en caso de que alguien quiera simplemente hacer una u otra.
Verifique si el correo electrónico es válido:
function isValidEmailAddress($email = '''', $check_domain = false)
{
if (empty($email)) {
return false;
} else {
$success = true;
}
if (!filter_var((string) $email, FILTER_VALIDATE_EMAIL)) {
$success = false;
}
if ($check_domain && $success) {
list($name, $domain) = explode(''@'', trim($email) . "@");
if (!checkdnsrr($domain, ''MX'')) {
$success = false;
}
}
return array("success" => $success, "email" => $email);
}
Eliminar <> y UTF8, etc.
function sanitizeEmailAddress($email = '''') {
if (!empty($email)) {
$email = filter_var(strtolower(trim($email)), FILTER_SANITIZE_EMAIL);
}
return $email;
}
Uso de la muestra:
// test --
$list = array(''goodÂ@bad.com'', ''[email protected]'', ''[email protected]'', ''quick@us'', '''', ''<[email protected]>'', ''[email protected]'', ''[email protected]'', ''[email protected]'', ''[email protected]'', ''[email protected]'');
foreach($list as $email) {
$ret = isValidEmailAddress( sanitizeEmailAddress($email), false );
if ($ret[''success'']) {
echo "GOOD " . $ret[''email''];
} else {
echo "BAD " .$email;
}
echo "/n";
}
Resultados:
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
BAD quick@us
BAD
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
si usa la opción de dominio: $ ret = isValidEmailAddress (sanitizeEmailAddress ($ email), true);
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
BAD quick@us
BAD
GOOD [email protected]
GOOD [email protected]
GOOD [email protected]
BAD [email protected]
BAD [email protected]
BAD [email protected]