Un honeypot en formularios web es un campo de entrada invisible, oculto a los usuarios humanos mediante CSS pero visible para los bots automatizados que parsean el HTML. Como los usuarios legítimos nunca ven (ni rellenan) el campo, cualquier envío con un honeypot no vacío se rechaza como spam. La técnica se popularizó hacia 2007 a través de blogs antispam y el plugin de WordPress "Honeypot for Contact Form 7", y es la alternativa respetuosa con la privacidad a CAPTCHAs como Google reCAPTCHA: sin scripts de terceros, sin cookies, sin problemas de accesibilidad ni pérdida de conversión.
¿Cómo funciona un honeypot?
El servidor añade un campo extra al formulario (a menudo website, url, email_confirm, etc.). El campo se oculta con display: none, visibility: hidden, position: absolute; left: -9999px, un <label> vacío o un envoltorio con tabindex="-1" autocomplete="off". Los bots rellenan indiscriminadamente todos los campos, incluido el cebo. En el envío el servidor comprueba:
- Campo vacío → humano, procesar.
- Campo lleno → bot, descartar silenciosamente o devolver 200 OK sin guardar.
Honeypot vs CAPTCHA: ¿cuál es mejor?
| Criterio | Honeypot | CAPTCHA (reCAPTCHA) |
|---|---|---|
| Fricción para el usuario | Ninguna | Media–alta |
| Accesibilidad (WCAG 2.2) | Conforme | Necesita alternativa audio |
| Privacidad / RGPD | Sin llamadas a terceros | Carga scripts Google, requiere consentimiento |
| Rendimiento | ~0 KB | ~200 KB JS |
| Detección de bots | ~95 % spam básico | ~99 % incluso bots inteligentes |
| Impacto en conversión | Ninguno | 3–29 % caída |
Para la mayoría de sitios WordPress, un honeypot más una comprobación de tiempo bloquea suficiente spam — sin el coste legal ni de UX de un CAPTCHA.
¿Cómo añado un honeypot a un formulario WordPress?
Contact Form 7
Instala el plugin gratuito "Honeypot for Contact Form 7" (más de 1 millón de instalaciones activas) y añade el tag [honeypot website] a tu formulario.
WPForms / Gravity Forms / Fluent Forms
Los tres incluyen opción de honeypot integrada — actívala con un clic.
Formulario WordPress propio
<p style="position:absolute;left:-9999px;" aria-hidden="true">
<label for="website">Deja este campo vacío</label>
<input type="text" name="website" id="website" tabindex="-1" autocomplete="off">
</p>if ( ! empty( $_POST['website'] ) ) {
wp_die( 'Spam detectado', 'Error', array( 'response' => 200 ) );
}Buenas prácticas para honeypots
- Nombres plausibles como
website,url,company— nuncahoneypot. - Ocultar con CSS, no con
type="hidden". tabindex="-1"yautocomplete="off"para usuarios de teclado y gestores de contraseñas.aria-hidden="true"para lectores de pantalla.- Combinar con control de tiempo — rechazar envíos en menos de 2–3 s.
- Devolver 200 OK al rechazar para que los bots no aprendan a esquivar.
¿Cuándo no basta un honeypot?
Bots avanzados que ejecutan JS y respetan la visibilidad CSS (Puppeteer / headless Chrome) saltan el honeypot. Para objetivos de alto valor (login, pago, lead-gen con recompensa) combina honeypot + tiempo + Cloudflare Turnstile o rate limiting. El otro significado de "honeypot" — un servidor deliberadamente vulnerable para estudiar atacantes — es un concepto de ciberseguridad distinto, no relacionado con formularios.
Qué comprueba InspectWP
InspectWP analiza cada formulario en la página rastreada y marca la falta de protección antispam en formularios de contacto y login. También detecta scripts de Google reCAPTCHA bajo RGPD, para comparar uso de honeypot vs CAPTCHA en tu sitio.