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.
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ón | Qué ven los visitantes | Quién verifica | Conviene saber |
|---|---|---|---|
| reCAPTCHA v2 | Una casilla, a veces rompecabezas de imágenes | Tu servidor, con Google | Conocido. Los rompecabezas son la queja principal |
| reCAPTCHA v3 | Nada | Tu servidor, con Google | Devuelve una puntuación de 0.0 a 1.0. Tú eliges el corte y gestionas la zona gris |
| Cloudflare Turnstile | Normalmente nada, a veces una casilla | Tu servidor, con Cloudflare | Sin rompecabezas de imágenes. Sin coste para hasta 20 widgets |
| hCaptcha | Una casilla, a veces rompecabezas de imágenes | Tu servidor, con hCaptcha | Parecido en forma a reCAPTCHA v2, de otra empresa. Un plan Basic gratuito, con planes Pro y Enterprise de pago |
| Friendly Captcha | Un pequeño widget que resuelve un rompecabezas en segundo plano | Tu servidor, con Friendly Captcha | Proof of work en lugar de señales de rastreo. Gratis para sitios pequeños no comerciales, planes de pago para todos los demás |
| ALTCHA | Un pequeño widget que resuelve un rompecabezas en segundo plano | Solo tu propio servidor | Open source y autoalojado, así que sin terceros. Tú lo ejecutas y lo mantienes |
| No captcha | Nada | Tu servidor | Honeypot, 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
- 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.
- 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.
- 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.
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.
| Pieza | reCAPTCHA v2 | Turnstile |
|---|---|---|
| Script | https://www.google.com/recaptcha/api.js | https://challenges.cloudflare.com/turnstile/v0/api.js |
| Elemento | <div class="g-recaptcha" data-sitekey> | <div class="cf-turnstile" data-sitekey> |
| Campo del token | g-recaptcha-response | cf-turnstile-response |
| URL de verificación | https://www.google.com/recaptcha/api/siteverify | https://challenges.cloudflare.com/turnstile/v0/siteverify |
| Parámetros de verificación | secret, response, remoteip | secret, 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
actionen su respuesta. - Actualiza tu Content Security Policy: permite
https://challenges.cloudflare.comenscript-srcyframe-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-responsehace 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
fetchllama achallenge()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.
Comprueba que funciona
- Envía el formulario después del cambio. El envío se acepta y como mucho viste una casilla.
- Envía al endpoint con curl y sin token. Se rechaza, lo que demuestra que el servidor comprueba el nuevo token.
- Busca en tus páginas
g-recaptchayrecaptcha/api.js. No queda nada. - Abre Submissions en el panel. El nuevo envío está ahí con todos los campos que mandaste.
- ¿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-responsedurante 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
Para la mayoría de los formularios, Cloudflare Turnstile: suele ser invisible, no cuesta nada a pequeña escala y se verifica con los mismos parámetros secret y response. Si no quieres ningún tercero, funciona una herramienta de proof-of-work autoalojada como ALTCHA. Muchos formularios de contacto no necesitan captcha una vez que tienen un honeypot, puntuación y un límite de frecuencia.
La documentación de facturación de Google indica un cupo gratuito de 10.000 evaluaciones al mes, con niveles de pago por encima. Consulta los precios actuales de Google antes de planificar en torno a eso.
No. Ikiform solo verifica Cloudflare Turnstile, ya sea su propia verificación gestionada o tus propias claves de Turnstile. Quita otros widgets de captcha de los formularios que envían a Ikiform.
Normalmente no. Cambias la URL del script, la clase del elemento, el nombre del campo del token y la URL de verificación, y mantienes los mismos parámetros secret y response. Despliega a la vez la página y el cambio del servidor.
¿Te atascaste en un paso o quieres una guía para tu caso? Escribe a hello@ikiform.com.