DNS, Email & Deliverability

Por qué tu formulario de contacto es tu mayor riesgo de spam

La mayoría de los formularios de contacto están configurados para enviar correo electrónico directamente a partir de la entrada del usuario. Eso hace que sean triviales de explotar.

The Wux Webtools Team The Wux Webtools Team 10 min de lectura Asistido por IA, revisado por humanos
Abstract illustration of a contact form with warning symbols representing spam vulnerability
Tabla de contenido
  1. El problema es más antiguo de lo que crees
  2. Qué hace que los formularios de contacto sean tan explotables
  3. La forma correcta de enviar correos desde un formulario de contacto
  4. La limitación de frecuencia no es opcional
  5. Los CAPTCHAs son una concesión, no una solución
  6. Cuándo usar un servicio de formularios de terceros
  7. El problema de DMARC
  8. ¿Qué ocurre con el [consentimiento de cookies y el seguimiento de formularios](/es/blog/2026-05-02-what-changed-for-cookies-in-2026-and-what-to-do-about-it)?
  9. Puntos clave
  10. FAQ
  11. Fuentes

El problema es más antiguo de lo que crees

Los formularios de contacto han sido un vector de spam desde principios de la década de 2000, pero el problema ha empeorado a medida que los proveedores de correo han endurecido sus requisitos de autenticación. La mayoría de los formularios de contacto siguen construyéndose de la misma manera: el usuario rellena un formulario, tu servidor envía un correo usando la dirección del usuario en el encabezado From, y tú esperas las respuestas.

Esta es una vulnerabilidad clásica de suplantación de correo electrónico. Los spammers pueden usar tu formulario para enviar correos que parecen proceder de cualquier dirección que quieran, enrutados a través de la IP de tu servidor. Si se envía suficiente spam de esta forma, tu dominio queda marcado y tus correos transaccionales legítimos dejan de llegar a las bandejas de entrada.

La solución es sencilla, pero la mayoría de los tutoriales siguen haciéndolo mal.

Qué hace que los formularios de contacto sean tan explotables

Un formulario de contacto típico acepta tres campos: nombre, correo electrónico y mensaje. El manejador del lado del servidor toma esa dirección de correo y la coloca directamente en el encabezado From de un mensaje SMTP saliente. Esto es cómodo para responder —basta con pulsar "responder" en tu bandeja de entrada—, pero también es un regalo para los spammers.

Esto es lo que ocurre cuando un spammer encuentra tu formulario:

  1. Envía el formulario con la dirección de correo de una víctima en el campo "from"
  2. Tu servidor envía obedientemente un correo con la dirección de esa víctima en el encabezado From
  3. El servidor de correo de la víctima ve un correo que afirma proceder de su dominio, pero que se origina desde tu IP
  4. Si tu dominio carece de registros SPF/DKIM/DMARC adecuados (o incluso si los tiene), el correo puede seguir pasando porque muchos servidores son permisivos con el tráfico de formularios de contacto
  5. La víctima recibe spam que parece proceder de su propia dirección, o tu dominio queda marcado por suplantación

Esto no es un ataque teórico. Ocurre constantemente. Si tienes un formulario de contacto y nunca has revisado los registros de tu servidor de correo, probablemente ya se esté usando de esta manera.

La forma correcta de enviar correos desde un formulario de contacto

La solución es no poner nunca entradas del usuario en el encabezado From. En su lugar:

  • From: [email protected] (o cualquier dirección que controles)
  • Reply-To: La dirección de correo enviada por el usuario
  • Subject: Incluye el nombre del usuario si quieres, pero nunca su correo
  • Body: Incluye todos los datos del formulario, claramente etiquetados

De este modo, tu servidor solo envía correos desde direcciones que posees y que has autenticado correctamente. Cuando pulsas "responder" en tu bandeja de entrada, sigue yendo al usuario: eso es lo que hace Reply-To. Pero los spammers no pueden usar tu formulario para hacerse pasar por direcciones arbitrarias.

La mayoría de las bibliotecas de correo admiten esto de forma nativa. En PHPMailer de PHP:

$mail->setFrom('[email protected]', 'Contact Form');
$mail->addReplyTo($_POST['email'], $_POST['name']);

En smtplib de Python con email.mime:

msg['From'] = '[email protected]'
msg['Reply-To'] = form_data['email']

En Node.js con Nodemailer:

const mailOptions = {
  from: '[email protected]',
  replyTo: req.body.email,
  // ...
};

Si tu formulario de contacto actualmente coloca entradas del usuario en el encabezado From, esto se corrige con una sola línea. Hazlo hoy.

La limitación de frecuencia no es opcional

Incluso con una higiene correcta de encabezados, un formulario de contacto sin protección sigue siendo un vector de spam. Los spammers enviarán tu formulario cientos de veces con distintos cuerpos de mensaje, y tu bandeja de entrada se llenará de basura.

Necesitas limitación de frecuencia en varios niveles:

  • Por IP: No más de 5 envíos por hora desde la misma IP
  • Por correo: No más de 3 envíos al día desde la misma dirección de correo
  • Global: No más de 50 envíos por hora entre todos los usuarios (ajústalo según tu tráfico)

La limitación de frecuencia debe estar en el código de tu aplicación, no solo en la configuración de tu servidor web. La limitación de frecuencia de Nginx y Apache puede ayudar, pero opera a nivel de solicitud y no sabe nada sobre direcciones de correo ni patrones de abuso específicos del formulario.

Si usas un framework, probablemente haya un middleware de limitación de frecuencia que puedas incorporar. Si estás construyendo desde cero, un contador sencillo en Redis con claves que expiran funciona bien:

key = f"contact_form:{ip_address}"
count = redis.incr(key)
if count == 1:
    redis.expire(key, 3600)  # 1 hour
if count > 5:
    return error("Rate limit exceeded")

Esto no es infalible —los spammers pueden rotar IPs—, pero eleva significativamente el coste del abuso.

Los CAPTCHAs son una concesión, no una solución

reCAPTCHA v3 de Google es invisible y puntúa a los usuarios en función de su comportamiento, lo que suena ideal. En la práctica, bloquea a usuarios legítimos más a menudo de lo que cabría esperar, especialmente usuarios en VPNs, Tor o redes corporativas compartidas.

reCAPTCHA v2 (la casilla "I'm not a robot") es más fiable, pero añade fricción. Los campos honeypot —entradas de formulario ocultas que los humanos no rellenarán pero los bots sí— capturan bots poco sofisticados sin ningún impacto para el usuario, pero son triviales de eludir para cualquier spammer serio.

El mejor enfoque es por capas:

  1. Encabezados de correo adecuados (no negociable)
  2. Limitación de frecuencia (no negociable)
  3. Campo honeypot (ganancia fácil, sin desventajas)
  4. CAPTCHA solo si sigues recibiendo una cantidad significativa de spam después de lo anterior

Si añades un CAPTCHA, usa reCAPTCHA v3 con un umbral bajo (0.5 o menos) y una alternativa a v2 para los usuarios con mala puntuación. Esto mantiene baja la fricción para la mayoría de los usuarios y, aun así, bloquea bots.

Cuándo usar un servicio de formularios de terceros

Si gestionas un sitio pequeño y no quieres mantener infraestructura de formularios, servicios de terceros como Formspree, Tally o Netlify Forms se encargan de todo esto por ti. Limitan la frecuencia, validan y envían correos desde sus propios dominios, así que tu reputación se mantiene limpia.

La contrapartida es que estás enviando datos de usuarios a un tercero, lo que puede entrar en conflicto con tu política de privacidad o tus obligaciones bajo el GDPR. Procesar datos del lado del cliente es una tendencia creciente para equipos preocupados por la privacidad, pero los formularios de contacto requieren inherentemente procesamiento del lado del servidor: no puedes enviar correo desde el navegador sin exponer credenciales.

Si gestionas consultas sensibles (legales, médicas, financieras), probablemente necesites ejecutar tu propia infraestructura de formularios. Para todo lo demás, un servicio de terceros es una opción razonable.

El problema de DMARC

Aunque corrijas los encabezados de tu formulario de contacto, no estás seguro si tu dominio carece de una política DMARC. DMARC indica a los servidores de correo receptores qué hacer con el correo que falla las comprobaciones SPF o DKIM. Sin ella, los spammers aún pueden enviar correos que parecen proceder de tu dominio, aunque no estén usando tus servidores.

Configurar DMARC queda fuera del alcance de este artículo, pero si te tomas en serio la reputación del correo, no es negociable. Empieza con una política solo de supervisión (p=none) y avanza gradualmente a p=quarantine o p=reject a medida que verifiques que tu correo legítimo está correctamente autenticado.

¿Qué ocurre con el consentimiento de cookies y el seguimiento de formularios?

Si tu formulario de contacto usa analíticas o píxeles de marketing para rastrear envíos, probablemente estés sujeto a las normas del GDPR y ePrivacy. La mayoría de los formularios de contacto no necesitan seguimiento: ya sabes que alguien envió el formulario porque recibiste el correo; pero si usas algo como Facebook Pixel o eventos de Google Analytics, necesitas consentimiento explícito antes de que se carguen esos scripts.

El enfoque más simple es no rastrear los envíos del formulario de contacto en absoluto. Si debes rastrearlos, carga los scripts de seguimiento solo después de que el usuario dé su consentimiento, y asegúrate de que tu banner de consentimiento sea conforme.

Puntos clave

  • Nunca pongas direcciones de correo enviadas por usuarios en el encabezado From. Usa Reply-To en su lugar.
  • La limitación de frecuencia es obligatoria. Impleméntala a nivel de aplicación, no solo en el servidor web.
  • Los campos honeypot son una ganancia gratuita. Los CAPTCHAs deberían ser el último recurso.
  • Los servicios de formularios de terceros son una opción razonable para sitios pequeños, pero introducen compromisos de privacidad.
  • Si envías cualquier correo desde tu dominio, necesitas una política DMARC.

FAQ

Q: ¿Puedo simplemente desactivar el formulario de contacto y usar un enlace mailto en su lugar?

A: Puedes, pero los enlaces mailto exponen tu dirección de correo a los scrapers, y pierdes la capacidad de recopilar datos estructurados. Si el spam es abrumador, un enlace mailto es mejor que un formulario de contacto roto, pero arreglar el formulario es mejor que ambas opciones.

Q: ¿Y si necesito enviar correos desde la dirección del usuario por motivos legítimos?

A: Casi con toda seguridad no lo necesitas. Si crees que sí, probablemente estás intentando resolver un problema de flujo de trabajo (como el enrutamiento de respuestas) que Reply-To ya resuelve. Si realmente necesitas enviar correos desde direcciones arbitrarias, necesitas un servicio de correo dedicado con autenticación adecuada, no un formulario de contacto.

Q: ¿Cómo sé si ya están abusando de mi formulario de contacto?

A: Revisa los registros de tu servidor de correo para ver conexiones SMTP salientes. Si ves un alto volumen de correos salientes a direcciones que no reconoces, o si tu dominio ha sido marcado por bases de datos de spam como Spamhaus, probablemente te estén usando como relay. Herramientas como MXToolbox pueden comprobar la reputación de tu dominio.

Q: ¿Es seguro usar un servicio CAPTCHA gratuito?

A: reCAPTCHA de Google es gratuito y se usa ampliamente, pero envía datos de usuarios a Google, lo que puede entrar en conflicto con tu política de privacidad. hCaptcha es una alternativa centrada en la privacidad que no entrena modelos de IA con tus usuarios. Cloudflare Turnstile es otra opción menos intrusiva que los CAPTCHAs tradicionales.

Q: ¿Cuál es la diferencia entre SPF, DKIM y DMARC?

A: SPF enumera qué servidores de correo tienen permitido enviar correos desde tu dominio. DKIM firma criptográficamente el correo saliente para que los destinatarios puedan verificar que no fue manipulado. DMARC los vincula y les dice a los destinatarios qué hacer si un correo falla las comprobaciones SPF o DKIM. Necesitas los tres para una autenticación de correo adecuada.

Fuentes

Five-step flow showing how a spammer abuses a contact form by putting a victim email in the From header, causing spoofed mail to pass through your server
InfographicHow a contact form turns into a spoofing relay — A simple five-step chain shows how one unsafe header turns your form into a spam relay
Side-by-side comparison of unsafe and safe contact form email headers, showing user email in From on the left and Reply-To on the right
InfographicWrong vs right contact form email headers — The safe pattern is simple: your domain in From, user input only in Reply-To
Checklist-style security stack for contact forms with exact rate limits, honeypot, and CAPTCHA fallback thresholds
InfographicLayered defenses for contact form spam — Start with headers and rate limits, then add honeypots, and only use CAPTCHA as a fallback

Preguntas frecuentes

¿Puedo simplemente desactivar el formulario de contacto y usar un enlace mailto en su lugar?
Puedes, pero los enlaces mailto exponen tu dirección de correo a los scrapers, y pierdes la capacidad de recopilar datos estructurados. Si el spam es abrumador, un enlace mailto es mejor que un formulario de contacto roto, pero arreglar el formulario es mejor que ambas opciones.
¿Y si necesito enviar correos desde la dirección del usuario por motivos legítimos?
Casi con toda seguridad no lo necesitas. Si crees que sí, probablemente estás intentando resolver un problema de flujo de trabajo (como el enrutamiento de respuestas) que `Reply-To` ya resuelve. Si realmente necesitas enviar correos desde direcciones arbitrarias, necesitas un servicio de correo dedicado con autenticación adecuada, no un formulario de contacto.
¿Cómo sé si ya están abusando de mi formulario de contacto?
Revisa los registros de tu servidor de correo para ver conexiones SMTP salientes. Si ves un alto volumen de correos salientes a direcciones que no reconoces, o si tu dominio ha sido marcado por bases de datos de spam como Spamhaus, probablemente te estén usando como relay. Herramientas como MXToolbox pueden comprobar la reputación de tu dominio.
¿Es seguro usar un servicio CAPTCHA gratuito?
reCAPTCHA de Google es gratuito y se usa ampliamente, pero envía datos de usuarios a Google, lo que puede entrar en conflicto con tu política de privacidad. hCaptcha es una alternativa centrada en la privacidad que no entrena modelos de IA con tus usuarios. Cloudflare Turnstile es otra opción menos intrusiva que los CAPTCHAs tradicionales.
¿Cuál es la diferencia entre SPF, DKIM y DMARC?
SPF enumera qué servidores de correo tienen permitido enviar correos desde tu dominio. DKIM firma criptográficamente el correo saliente para que los destinatarios puedan verificar que no fue manipulado. DMARC los vincula y les dice a los destinatarios qué hacer si un correo falla las comprobaciones SPF o DKIM. Necesitas los tres para una autenticación de correo adecuada.

Fuentes y lecturas adicionales

  1. OWASP: Email Header Injection
  2. RFC 5322: Internet Message Format
  3. DMARC.org: Overview
  4. Spamhaus: Domain Blocklists
Sobre el autor
The Wux Webtools Team

Última actualización:

Sigue leyendo