KheperlabKheperlab
Tutoriales

Cómo proteger un formulario de contacto contra spam con reCAPTCHA

Un formulario de contacto sin protección recibe, tarde o temprano, cientos de envíos automatizados de bots. reCAPTCHA filtra la mayoría antes de que lleguen a tu bandeja de entrada.

Por qué un formulario público necesita esta protección

Cualquier bot puede enviar el formulario sin marcarlo si nadie verifica que quien lo envía es una persona real. Sin protección, tu bandeja de entrada termina llena de spam automatizado, y en los peores casos el formulario se usa para intentar ataques contra tu propio servidor.

reCAPTCHA v2 vs v3: cuál elegir

reCAPTCHA v2reCAPTCHA v3
Experiencia del usuarioCasilla "No soy un robot", a veces con imágenesInvisible, sin interacción del usuario
Cómo decideInteracción visible más análisis de comportamientoSolo análisis de comportamiento, con una puntuación de 0 a 1
Facilidad de integraciónMás simpleRequiere definir un umbral de puntuación aceptable

v2 es más simple de implementar y suficiente para la mayoría de formularios pequeños; por eso es la que cubre esta guía paso a paso.

Paso 1: registrar tu sitio en reCAPTCHA

Entra a la consola de administración de reCAPTCHA de Google
Registra tu dominio y elige la versión v2 tipo casilla.
Copia tus dos claves
Una clave de sitio (pública, va en el HTML) y una clave secreta (privada, va en el servidor).

Paso 2: agregar el widget al formulario

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

<form action="/enviar" method="POST">
  <input name="email" type="email" required>
  <textarea name="mensaje" required></textarea>
  <div class="g-recaptcha" data-sitekey="TU_CLAVE_DE_SITIO"></div>
  <button type="submit">Enviar</button>
</form>

Paso 3: verificar la respuesta en el servidor

El widget por sí solo no bloquea nada; la verificación real ocurre en el servidor, confirmando con Google que la respuesta del usuario es válida:

const respuesta = await fetch('https://www.google.com/recaptcha/api/siteverify', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: `secret=TU_CLAVE_SECRETA&response=${tokenRecibido}`
});

const resultado = await respuesta.json();
if (!resultado.success) {
  // rechazar el envío, probablemente es un bot
}
Nota: nunca expongas tu clave secreta en el código HTML o JavaScript del lado del cliente; esa clave solo debe usarse en el servidor, nunca en el navegador del visitante.

Una capa adicional simple: el honeypot

Un campo honeypot, un input invisible para personas pero visible para bots automatizados, filtra buena parte del spam más básico sin necesidad de ningún servicio externo, y puede combinarse con reCAPTCHA para una protección todavía más completa.

¿Tu formulario recibe spam constantemente?

Conversemos sobre protegerlo →