Frena el spam en formularios de contacto

Frena el spam en formularios de contacto7 min de lectura

Alternativas a reCAPTCHA para formularios web

Compara alternativas a reCAPTCHA para formularios, de Turnstile y hCaptcha a proof-of-work o ningún captcha, y cambia con un ajuste pequeño y seguro.

Preet SutharFundador, Ikiform

Cloudflare Turnstile es el reemplazo más directo de reCAPTCHA: es casi siempre invisible, usa el mismo esquema de site key y secret key, y su comprobación en el servidor recibe los mismos parámetros. hCaptcha encaja en sitios que quieren desafíos de imágenes de alguien que no sea Google, y las herramientas de proof-of-work como ALTCHA funcionan sin ningún tercero. Para muchos formularios de contacto, un honeypot, la puntuación del contenido y un límite de frecuencia hacen innecesario un captcha.

Por qué la gente deja reCAPTCHA

reCAPTCHA sigue funcionando. Los motivos para sustituirlo suelen tener que ver con lo que les cuesta a los visitantes y a ti. La versión 2 muestra rompecabezas de imágenes a algunos visitantes, lo que es lento en el móvil y difícil para quienes usan lectores de pantalla. La versión 3 es invisible pero devuelve una puntuación cuyo umbral tienes que fijar tú, sin un desafío al que recurrir. Y reCAPTCHA es ahora un producto de Google Cloud: la documentación de facturación de Google indica un cupo gratuito de 10.000 evaluaciones al mes, con niveles de pago por encima.

Algunos equipos también quieren menos scripts de terceros en sus páginas. Si eso importa para tus obligaciones de privacidad es una cuestión para tu propia revisión legal; esta página solo compara cómo funcionan las herramientas.

Las alternativas, comparadas

OpciónQué ven los visitantesQuién verificaConviene saber
reCAPTCHA v2Una casilla, a veces rompecabezas de imágenesTu servidor, con GoogleConocido. Los rompecabezas son la queja principal
reCAPTCHA v3NadaTu servidor, con GoogleDevuelve una puntuación de 0.0 a 1.0. Tú eliges el corte y gestionas la zona gris
Cloudflare TurnstileNormalmente nada, a veces una casillaTu servidor, con CloudflareSin rompecabezas de imágenes. Sin coste para hasta 20 widgets
hCaptchaUna casilla, a veces rompecabezas de imágenesTu servidor, con hCaptchaParecido en forma a reCAPTCHA v2, de otra empresa. Un plan Basic gratuito, con planes Pro y Enterprise de pago
Friendly CaptchaUn pequeño widget que resuelve un rompecabezas en segundo planoTu servidor, con Friendly CaptchaProof of work en lugar de señales de rastreo. Gratis para sitios pequeños no comerciales, planes de pago para todos los demás
ALTCHAUn pequeño widget que resuelve un rompecabezas en segundo planoSolo tu propio servidorOpen source y autoalojado, así que sin terceros. Tú lo ejecutas y lo mantienes
No captchaNadaTu servidorHoneypot, tiempo firmado, puntuación del contenido y límites de frecuencia. Frena la mayoría de los bots, no todos

Todas las opciones salvo la última dependen igualmente de una comprobación en el servidor. Un widget por sí solo no frena nada, porque un bot puede enviar a tu endpoint sin cargar la página.

Qué pide cada opción a las personas

Juzga cada opción por el visitante al que más le cuesta. Los rompecabezas de imágenes son lentos en el móvil y difíciles o imposibles para quien no ve bien; las alternativas de audio ayudan a algunas personas y frustran a otras. Las verificaciones invisibles, como el modo habitual de Turnstile, reCAPTCHA v3 y los widgets de proof-of-work, no piden nada a la mayoría de los visitantes, pero aun así pueden fallar con navegadores centrados en la privacidad, redes estrictas o dispositivos antiguos. Cuando eso pasa, la persona necesita una salida: una casilla visible, un mensaje claro o una dirección de email a la que escribir. Un formulario que falla en silencio pierde justo los mensajes de los que nunca te enteras.

Elige con dos preguntas

Cómo elegir un reemplazo de reCAPTCHA con dos preguntasEmpieza aquíSin servidor: un sitio estático o un creador de sitios¿los botssuperan lascomprobacionesinvisibles?¿puedesejecutarcódigo en unservidor?tu propio widgetTurnstile, hCaptcha oALTCHAsigue sin captchahoneypot, puntuación,límiteel formularioenvía a un backendel backendverifica tusclavesSolo Turnstile, conIkiformo una verificacióngestionadaninguna clavesísínoCómo elegir un reemplazo de reCAPTCHA con dos preguntasEmpieza aquíSin servidor: un sitio estático o un creador de sitios¿los botssuperan lascomprobacionesinvisibles?¿puedesejecutarcódigo enunservidor?tu propio widgetTurnstile, hCaptchao ALTCHAsiguesincaptchahoneypot,puntuación,límiteel formularioenvía a unbackendel backendverifica tusclavesSolo Turnstile, conIkiformo unaverificacióngestionadaninguna clavesísíno
  1. Primero pregúntate si los bots superan las comprobaciones invisibles. Si no, sigue sin captcha con un honeypot, la puntuación y un límite de frecuencia.
  2. Si las superan, pregúntate si puedes ejecutar código en un servidor. Si puedes, elige un widget como Turnstile, hCaptcha o ALTCHA y verifícalo en tu servidor.
  3. Sin servidor, envía el formulario a un backend que verifique tus claves de Turnstile por ti, o usa una verificación gestionada que no necesita claves.
La mayoría de los formularios de contacto se quedan en la primera pregunta. Mide tu spam antes de añadir ningún widget.

Cambia de reCAPTCHA a Turnstile

Son tan parecidos que el cambio son unas pocas líneas en cada lado. Crea un widget de Turnstile en el panel de Cloudflare para los mismos hostnames y luego cambia a la vez el markup y la comprobación en el servidor.

PiezareCAPTCHA v2Turnstile
Scripthttps://www.google.com/recaptcha/api.jshttps://challenges.cloudflare.com/turnstile/v0/api.js
Elemento<div class="g-recaptcha" data-sitekey><div class="cf-turnstile" data-sitekey>
Campo del tokeng-recaptcha-responsecf-turnstile-response
URL de verificaciónhttps://www.google.com/recaptcha/api/siteverifyhttps://challenges.cloudflare.com/turnstile/v0/siteverify
Parámetros de verificaciónsecret, response, remoteipsecret, response, remoteip, idempotency_key
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="g-recaptcha" data-sitekey="RECAPTCHA_SITE_KEY"></div>
  <button>Send</button>
</form>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.RECAPTCHA_SECRET_KEY!,
  response: String(form.get("g-recaptcha-response") ?? ""),
});
const check = await fetch("https://www.google.com/recaptcha/api/siteverify", { method: "POST", body });
const { success } = (await check.json()) as { success: boolean };
  • Esto cubre las claves clásicas de reCAPTCHA, verificadas en siteverify. Las claves creadas en Google Cloud se comprueban en su lugar con la API de evaluaciones de reCAPTCHA Enterprise; la parte de Turnstile es la misma.
  • Si usabas v3, quita tu umbral de puntuación. Turnstile responde pasa o no pasa; comprueba en su lugar action en su respuesta.
  • Actualiza tu Content Security Policy: permite https://challenges.cloudflare.com en script-src y frame-src, y quita las entradas de Google cuando nada las use.
  • Publica el markup y el cambio del servidor en un mismo despliegue. Una página con el nuevo widget que envía a un servidor que aún espera g-recaptcha-response hace fallar todos los envíos.

Sustituir reCAPTCHA con Ikiform

Si tu formulario envía a Ikiform, quita por completo el widget de reCAPTCHA. Ikiform no verifica tokens de reCAPTCHA ni de hCaptcha. El valor sobrante g-recaptcha-response llegaría como un campo extra, o fallaría con 422 validation_failed como campo desconocido si definiste los campos del formulario. Luego elige qué lo sustituye:

  • Nada más. El honeypot, la puntuación del contenido y los límites de frecuencia se ejecutan en todos los formularios. Muchos formularios de contacto no necesitan más.
  • Spam check en Ikiform. Cloudflare Turnstile, ejecutado por Ikiform, sin cuenta ni claves. Un envío HTML básico recibe una breve página de verificación; el código con fetch llama a challenge() de @ikiform/sdk.
  • Tus propias claves de Turnstile. Mantén tu propio widget en la página, pega las claves en los ajustes del formulario e Ikiform verifica el token.
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>

Ese formulario no tiene ningún widget. Con Spam check en Ikiform, la verificación humana ocurre en ikiform.com después del envío, así que tu página no carga ningún script de captcha. La documentación de spam cubre cada modo.

Si a la vez dejas un servicio de formularios alojado, las páginas comparativas de Formspree y Netlify Forms cubren qué más cambia.

Comprueba que funciona

  1. Envía el formulario después del cambio. El envío se acepta y como mucho viste una casilla.
  2. Envía al endpoint con curl y sin token. Se rechaza, lo que demuestra que el servidor comprueba el nuevo token.
  3. Busca en tus páginas g-recaptcha y recaptcha/api.js. No queda nada.
  4. Abre Submissions en el panel. El nuevo envío está ahí con todos los campos que mandaste.
  5. ¿No llegó nada? Cambia el filtro de estado del panel a Spam. El spam recibe la misma respuesta de éxito que un envío real.

Trampas habituales

  • Ajustes del creador de sitios. Los creadores de sitios con un ajuste de reCAPTCHA integrado pueden exigir el elemento en cada formulario mientras esté activado. Desactiva el ajuste antes de quitar los elementos.
  • Páginas en caché. Los visitantes con una página antigua en caché siguen enviando g-recaptcha-response durante un tiempo después de desplegar. Cuenta con algunos fallos, o acepta ambos tokens durante un día.
  • Puntuaciones de v3 en informes. Si hay paneles o alertas que leen la puntuación de reCAPTCHA, se quedarán mudos tras el cambio. Actualízalos.

Preguntas

¿Te atascaste en un paso o quieres una guía para tu caso? Escribe a hello@ikiform.com.