Laravel: Validación de correos con DNS y detección de Spoofing

Tiempo de lectura: 2.39 minutos

Póster del artículo Laravel: Validación de correos con DNS y detección de Spoofing

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 columna email.
  • 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.

# laravel # mail # gmail

Logo de Programación y más

Comparte este post si te fue de ayuda 🙂.

Regístrate

Accede a todos los cursos, y resuelve todas tus dudas.

Cursos Recomendados 🚀

Imagen para el curso Aprende Laravel

Aprende Laravel

Aprende Laravel desde cero y desarrolla aplicaciones web reales, en tiempo récord, de la mano de Laravel.

Iniciar curso
Imagen para el curso Laravel Upgrade

Laravel Upgrade

Actualiza tus proyectos desde cualquier versión hasta la última versión estable de Laravel.

Iniciar curso
Imagen para el curso Laravel y Vue

Laravel y Vue

Desarrollemos un Messenger! Aprende sobre Channels, Queues, Vuex, JWT, Sesiones, BootstrapVue y mucho más.

Iniciar curso

Espera un momento 🎁 ...

¿Te gustaría aprender a programar, gratis?

Mago de Programación y más

Sólo debes registrarte 😉.