Contents
Introducción
El honeypot es una técnica simple y eficaz para reducir el spam en formularios —incluyendo los comentarios de WordPress— sin molestar a usuarios reales con CAPTCHA. Consiste en añadir campos que están ocultos para humanos pero visibles para muchos bots si esos campos vienen rellenos, el envío se considera spam. Combinando un honeypot con pequeñas comprobaciones por JavaScript y control de tiempo entre renderizado y envío, se incrementa la tasa de detección y se reduce el riesgo de falsos positivos.
Ventajas y limitaciones
- Ventajas: implementación ligera, sin fricción para el usuario, sin dependencias externas.
- Limitaciones: bots avanzados que ejecutan JavaScript o detectan campos ocultos pueden evadirlo conviene usarlo como parte de una estrategia combinada (Akismet, listas negras, filtrado por IP, etc.).
Resumen de la estrategia propuesta
- Agregar un campo trampa visible en el HTML pero oculto por CSS (off-screen) para que usuarios reales no lo vean ni lo rellenen.
- Agregar un campo oculto que sólo será marcado por JavaScript al cargar la página (por ejemplo, hp_js = 1). Muchos bots no ejecutan JS y fallarán esta comprobación.
- Agregar un campo de tiempo rellenado por JavaScript (hp_time) con la marca temporal del render en el servidor verificar que el tiempo transcurrido sea razonable (no demasiado rápido).
- En el servidor validar: si el campo trampa tiene contenido -> spam si falta la marca JS -> spam si el envío fue demasiado rápido o demasiado antiguo -> spam. Opcional: marcar el comentario como spam en lugar de bloquear para evitar falsos positivos bruscos.
Implementación práctica para WordPress (functions.php o plugin)
Las siguientes piezas de código pueden colocarse directamente en el archivo functions.php del tema o empaquetarse como un plugin. A continuación hay ejemplos de los fragmentos esenciales: CSS, JavaScript, inserción de campos en el formulario de comentarios y validación en PHP.
1) CSS para ocultar la trampa (mejor usar off-screen en lugar de display:none)
.hp-field { position: absolute left: -9999px top: auto width: 1px height: 1px overflow: hidden } .hp-field label { display: block }
2) JavaScript que marca la presencia de JS y escribe la marca temporal
document.addEventListener(DOMContentLoaded, function(){ var js = document.getElementById(hp_js) if (js) js.value = 1 var ts = document.getElementById(hp_time) if (ts) ts.value = Math.floor(Date.now()) })
3) Código PHP para inyectar los campos en el formulario y añadir los assets (ejemplo para functions.php)
echo echo echo // Campo que será marcado por JS echo // Campo de tiempo que completará JS con Date.now() echo } // Validación del honeypot antes de guardar el comentario add_filter(preprocess_comment,hp_preprocess_comment) function hp_preprocess_comment(commentdata){ // 1) Si el campo trampa contiene texto, es spam if (!empty(_POST[hp_trap])){ commentdata[comment_approved] = spam return commentdata } // 2) Si no se detectó ejecución de JS, probable bot if (empty(_POST[hp_js]) _POST[hp_js] !== 1){ commentdata[comment_approved] = spam return commentdata } // 3) Validación de tiempo (hp_time viene en ms) if (!empty(_POST[hp_time])){ submitted = intval(_POST[hp_time]) now = intval(microtime(true) 1000) diff = now - submitted // Demasiado rápido (< 3s) => sospechoso if (diff < 3000){ commentdata[comment_approved] = spam return commentdata } // Demasiado antiguo (>24h) => posible reenvío automático viejo if (diff > 86400000){ commentdata[comment_approved] = spam return commentdata } } else { // Sin HP_TIME => marcar como spam commentdata[comment_approved] = spam return commentdata } // Todo OK: devolver datos sin modificar return commentdata } ?>
4) Alternativa: plugin completo (cabecera mínima)
Pruebas y verificación
- Accede a una entrada y carga el formulario de comentarios desde un navegador normal. Envía un comentario válido. Debe publicarse o quedar en moderación como de costumbre.
- Abre las herramientas del desarrollador y manipula el DOM para rellenar el campo trampa (hp_trap) y envía: la entrada debe marcarse como spam.
- Desactiva JavaScript en el navegador y envía un comentario válido: el sistema debería marcarlo como spam si exigimos hp_js = 1. Si en tu caso necesitas permitir usuarios sin JS, ajusta la política (por ejemplo, en vez de marcar como spam, forzar moderación manual).
- Checa los tiempos: abre la consola y modifica hp_time a un valor muy pequeño para probar el bloqueo por envío rápido.
Buenas prácticas y ajustes finos
- Nombre del campo trampa: usar nombres que atraigan a bots (website, url, phone, company). Evita nombres evidentes como hp_trap en producción se suele ofuscar el nombre para evitar que bots específicos lo detecten.
- No usar display:none para ocultar la trampa si quieres que algunos screen readers sigan detectándola usar off-screen es más robusto. Añade aria-hidden y tabindex=-1 para accesibilidad.
- Registro y monitorización: antes de marcar como spam de forma irrevocable, puedes registrar en un log o almacenar meta del comentario para revisar falsos positivos.
- Combinación con otras medidas: el honeypot es buena primera línea combínalo con Akismet, listas negras, verificación de IP y límites de envío.
- Reacción ante detección: marcar como spam en lugar de bloquear bruscamente un envío evita una mala experiencia si hay un falso positivo.
Ejemplos de ajustes posibles
Si prefieres bloquear inmediatamente en lugar de marcar como spam, reemplaza las asignaciones a spam por llamadas a wp_die() con un mensaje genérico (o por un redirect silencioso). Si prefieres solo moderar sin marcar como spam, asigna comment_approved => 0.
Referencias
Documentación de filtros útiles de WordPress: preprocess_comment y comment_form_after_fields.
Conclusión
Un honeypot bien diseñado (campo trampa comprobación de JS control de tiempo) es una solución ligera y efectiva para reducir el spam en comentarios de WordPress sin añadir fricción a usuarios humanos. Ajusta los umbrales y registra eventos para minimizar falsos positivos y combínalo con otras defensas para obtener la máxima protección.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |