Laravel: Validación de correos con DNS y detección de Spoofing
Tiempo de lectura: 2.39 minutos
Lo que encontrarás en este artículo
En un primer momento, para la mayoría de proyectos, es suficiente con validar el formato de los correos de nuestros usuarios.
Por ejemplo, es obvio que abc
y 123
no son correos válidos.
En Laravel, validar el formato de los correos es tan simple como aplicar la regla de validación llamada email
:
$request->validate([
'email' => 'email'
]);
En este caso estamos validando que el campo email
de nuestro formulario cumpla con una única regla de validación, que en este caso lleva el mismo nombre.
Regla email
Por defecto, la regla email
valida el formato conforme al estándar RFC.
Es decir, 'email' => 'email'
equivale a 'email' => 'email:rfc'
.
Por ejemplo, el RFC 5322 establece que un email debe tener:
- Un nombre de usuario válido (antes del @)
- Un símbolo @
- Un dominio válido (después del @)
Ejemplo válido según RFC: [email protected]
Importante: garantiza que el email tenga una estructura correcta, pero no verifica si existe o es seguro.
Problemas más comunes
El problema con esta regla simple de validación es que, muchos correos inválidos aún serán aceptados por nuestro proyecto.
Por ejemplo:
Los 2 primeros son obviamente incorrectos. Y los 2 últimos podrían tratarse de errores de escritura.
Cómo validar mejor
Para esto podemos usar las siguientes 2 reglas específicas que nos provee Laravel para validar emails:
-
dns
: Verifica que el dominio que está en el correo (por ejemplo,example.com
) realmente exista y pueda recibir correos. -
spoof
: Detecta patrones típicos de spoofing.
Pero, ¿qué es spoofing?
Es cuando alguien intenta engañar o suplantar una identidad.
En este caso, hacer pasar un dominio falso por uno legítimo.
Por ejemplo, alguien registra un correo @gmial.com
a propósito, para hacerse pasar por @gmail.com
.
En nuestro caso, la regla de validación spoof
nos servirá también para identificar errores tipográficos.
Así, si alguien escribe mal su correo por estar apurado, lo podremos detectar y avisar a tiempo.
Dicho de otra forma, ninguno de los 4 ejemplos antes mencionados pasa la regla de validación siguiente:
$request->validate([
'email' => 'email:rfc,dns,spoof'
]);
Extensión PHP requerida
Si piensas usar la regla spoof
ten en cuenta que vas a necesitar la extensión intl
habilitada.
¿Cómo saber si la extensión se encuentra instalada y habilitada?
Para ello puedes ejecutar:
php -m | grep intl
Si el resultado de este comando imprime intl
, entonces la extensión ya se encuentra lista para su uso.
Cómo instalar intl
Esto va a depender de tu entorno.
Por ejemplo, si tu VPS es Ubuntu, y usas Apache como servidor web:
sudo apt-get install php-intl
sudo service apache2 restart
Pero si te encuentras en Windows, debes modificar el archivo php.ini
y descomentar la siguiente línea:
extension=intl
Regla de validación completa
Si se trata de un formulario de registro, podrías tener algo más elaborado como lo siguiente:
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email:rfc,dns,spoof',
'max:255',
Rule::unique('users', 'email')->where(fn($query) =>
$query->whereNull('deleted_at')->orWhereNotNull('deleted_at')
)
],
'password' => [
'required',
'confirmed',
Rules\Password::defaults()
],
]);
Como ves, para el campo email, no estamos indicando un string, sino un arreglo.
Eso es porque queremos aplicar más de una regla de validación.
De hecho, la última regla que vez aplicada al campo email, se conoce como rule object
.
Se trata de una forma pragramática de definir reglas, usando métodos que Laravel tiene disponibles.
Para este caso en particular, simplemente:
- Nos aseguramos de que el campo sea único, revisando la tabla
users
, específicamente su columnaemail
. - Y como tengo usuarios que pueden haber dado de baja su cuenta, me aseguro también de considerar aquellos que están
deleted
como parte de esta query.
Conclusión
Tal como vimos, en Laravel es muy sencillo validar correos, ya que el framework incluye reglas de validación propicias para ello.
Recuerda validar tus formularios, tanto de registro, como de recuperación de contraseña 😉.
Para continuar aprendiendo te recomiendo visitar mis cursos.