WP Manifestindependent plugin directory
manifest / security / secure-image-sequence-captcha

Secure Image Sequence CAPTCHA

Protege tus formularios de comentarios, inicio de sesión y registro de WordPress contra bots con un CAPTCHA de secuencia de imágenes seguro y fácil de usar.

by Soyunomas · github.com/soyunomas/secure-image-sequence-captcha · website

1stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/soyunomas/secure-image-sequence-captcha/archive/refs/heads/main.zip

Plugin de WordPress que protege comentarios, inicio de sesión y registro mediante desafíos visuales de secuencia, de un solo uso y vinculados a una sesión anónima.

Estado de la versión 1.6.0

Característica Estado
Imágenes incluidas 40 PNG de 256 × 256 píxeles
Categorías Animales, frutas, objetos y vehículos
Imágenes por categoría 10
Candidatas visibles 9 en una cuadrícula 3 × 3
Secuencia solicitada 4 imágenes ordenadas y sin duplicados
Idiomas Inglés, español, alemán y francés
WordPress mínimo 5.8
PHP mínimo 7.4

La versión 1.6.0 reúne el endurecimiento de seguridad realizado sobre la 1.5.0 y las mejoras posteriores de imágenes, accesibilidad e internacionalización. Se mantiene el número de versión 1.6.0.

Formularios protegidos

Desde Ajustes → Image Sequence CAPTCHA se puede activar la protección de forma independiente para:

  • Comentarios.
  • Inicio de sesión.
  • Registro de usuarios.

También se puede activar un bloqueo de acceso por IP con número máximo de intentos y duración configurables. Los fallos del CAPTCHA de comentarios utilizan contadores separados y no alimentan el bloqueo de inicio de sesión.

Por defecto, los usuarios autenticados no reciben CAPTCHA en comentarios. El comportamiento puede modificarse mediante el filtro sisc_show_for_logged_in_users_comments.

Modelo de seguridad de 1.6.0

Desafíos opacos y de un solo uso

  • El navegador nunca recibe los nombres reales de los objetos, categorías, archivos ni rutas del servidor.
  • Las imágenes se sirven mediante un endpoint opaco ligado al desafío y con metadatos genéricos.
  • Cada desafío queda vinculado a una cookie anónima HttpOnly, al formulario y, cuando corresponde, al ID de la entrada.
  • La respuesta correcta se almacena como HMAC-SHA-256 con secreto del servidor; no se guarda en texto plano ni como un hash de contraseña enumerable.
  • El primer intento consume atómicamente el desafío, tanto si la respuesta es correcta como si es incorrecta.
  • Los desafíos caducan a los tres minutos y no admiten replay.
  • Se rechazan envíos demasiado rápidos y selecciones duplicadas, incompletas o con identificadores desconocidos.

Límites y protección contra fuerza bruta

  • Existen límites independientes para la generación de desafíos, la validación y la descarga de imágenes.
  • Cada límite combina controles por sesión y por IP para impedir el bypass mediante rotación de cookies.
  • Los fallos reiterados de comentarios producen un bloqueo efectivo con respuesta HTTP 429.
  • El bloqueo de inicio de sesión conserva contadores y duración independientes.

Proxies y dirección del cliente

  • REMOTE_ADDR es la fuente predeterminada y segura.
  • CF-Connecting-IP, X-Forwarded-For o X-Real-IP solo se aceptan cuando la conexión directa procede de un CIDR de proxy configurado explícitamente como confiable.
  • X-Forwarded-For se resuelve de derecha a izquierda para ignorar direcciones falsas antepuestas por el cliente.
  • Se rechazan valores múltiples en cabeceras que deben contener una sola IP.
  • Se rechazan CIDR globales inseguros como 0.0.0.0/0 y ::/0.

No actives una cabecera reenviada hasta haber introducido las redes reales que pueden conectar directamente con el servidor de origen.

Comentarios por REST y XML-RPC

Cuando la protección de comentarios está activa, los comentarios anónimos mediante REST y XML-RPC se bloquean por defecto porque esas interfaces no muestran el CAPTCHA del navegador. Después de implementar una validación equivalente, un desarrollador puede modificar este comportamiento con:

  • sisc_block_anonymous_rest_comments
  • sisc_block_xmlrpc_comments

Imágenes personalizadas

  • Las categorías CAPTCHA de la biblioteca de medios solo pueden gestionarse o asignarse con manage_options.
  • La taxonomía no se expone mediante REST ni consultas públicas.
  • Se verifica la firma y el MIME real del archivo antes de decodificarlo.
  • Se limitan el tamaño del archivo, las dimensiones y el total de píxeles.
  • Se admiten JPEG, PNG, GIF, WebP y AVIF.
  • SVG se excluye deliberadamente.

Imágenes y experiencia de uso

El paquete incluye 40 ilustraciones semirrealistas creadas individualmente con un modelo generativo y normalizadas a PNG opaco de 256 × 256 píxeles, sin textos, logotipos ni marcas de agua:

  • 10 animales.
  • 10 frutas.
  • 10 objetos.
  • 10 vehículos.

Cada desafío elige una categoría, muestra 9 candidatas distintas en una cuadrícula 3 × 3 y solicita una secuencia ordenada de 4. La décima imagen permite variar las candidatas entre desafíos.

La interfaz incluye navegación mediante teclado, estados de foco visibles, indicador numérico del orden, botón de reinicio, mensajes mediante aria-live e instrucciones accesibles.

Cuando PHP GD está disponible se aplican pequeñas transformaciones deterministas por desafío. Sin GD, el flujo codificado se modifica de forma segura sin cambiar el contenido visible, evitando que el hash estático del archivo identifique directamente la respuesta.

Idiomas

El CAPTCHA sigue automáticamente el idioma activo de WordPress:

  • Inglés como idioma fuente y de reserva.
  • Español.
  • Alemán.
  • Francés.

Los catálogos incluidos traducen la pregunta, los 40 nombres de imágenes, las instrucciones, la accesibilidad, los estados dinámicos de JavaScript, los errores y la página de ajustes. Las variantes regionales sin catálogo exacto reutilizan la traducción base; por ejemplo, es_MX, de_AT y fr_CA.

Las categorías predefinidas se traducen automáticamente. En categorías personalizadas se utilizan los títulos de los adjuntos de la biblioteca de medios, por lo que el propietario debe escribirlos en el idioma que quiera mostrar.

Requisitos

  • WordPress 5.8 o superior.
  • PHP 7.4 o superior.
  • JavaScript habilitado en el navegador.
  • PHP GD opcional.
  • Cookies habilitadas para crear la sesión anónima del CAPTCHA.
  • Al menos 9 imágenes válidas por categoría personalizada.

Instalación

  1. Realiza una copia de seguridad del sitio.
  2. Abre Plugins → Añadir nuevo → Subir plugin.
  3. Selecciona el archivo ZIP e instala o sustituye la versión existente.
  4. Activa el plugin.
  5. Abre Ajustes → Image Sequence CAPTCHA.
  6. Activa comentarios, inicio de sesión y/o registro.
  7. Revisa la fuente de imágenes y el bloqueo de acceso.
  8. Conserva REMOTE_ADDR salvo que el origen esté protegido por un proxy o CDN cuyas redes conozcas con precisión.

Actualización desde 1.5.0

  • Se conservan las opciones existentes de formularios y bloqueo.
  • Las configuraciones antiguas de cabeceras IP se restablecen al modo seguro hasta configurar CIDR confiables.
  • Los desafíos pendientes de versiones anteriores quedan invalidados por el nuevo prefijo y protocolo.
  • La solución deja de utilizar wp_hash y pasa a HMAC-SHA-256 con secreto del servidor.
  • El conjunto actual contiene 40 imágenes y el mínimo de una categoría personalizada pasa a 9.

Después de actualizar, revisa especialmente la configuración del proxy y prueba cada formulario protegido en una ventana privada.

Configuración de imágenes personalizadas

  1. Sube las imágenes a la biblioteca de medios.
  2. Crea una categoría CAPTCHA desde la interfaz de medios.
  3. Asigna al menos 9 imágenes ráster distintas a esa categoría.
  4. Utiliza títulos claros y únicos: esos títulos forman el texto de la pregunta.
  5. Selecciona Media Library CAPTCHA categories como fuente de imágenes.

Si ninguna categoría personalizada contiene suficientes imágenes válidas, el plugin utiliza de forma segura los conjuntos incluidos.

Filtros para desarrolladores

  • sisc_show_for_logged_in_users_comments: muestra el CAPTCHA de comentarios a usuarios autenticados.
  • sisc_block_anonymous_rest_comments: controla el bloqueo de comentarios REST anónimos.
  • sisc_block_xmlrpc_comments: controla la retirada de wp.newComment en XML-RPC.
  • sisc_client_ip: permite revisar la IP ya resuelta; debe utilizarse con extremo cuidado para no debilitar la validación de proxies.

Pruebas incluidas

Desde el directorio del plugin:

php tests/test-security.php
php tests/test-challenge.php
php tests/test-plugin-smoke.php
python3 tests/test-static.py
node --check assets/js/sisc-captcha.js

Las pruebas cubren HMAC, replay, consumo de un solo intento, límites por IP, rotación de cookies, resolución de proxies, CIDR, endpoint opaco, imágenes, internacionalización, saneamiento de ajustes y arranque del plugin. Los scripts PHP solo se ejecutan bajo CLI/phpdbg y responden con 403 si se solicitan por HTTP.

El informe está disponible en docs/TEST-REPORT.md.

Limitaciones

Un CAPTCHA visual no es invulnerable a sistemas avanzados de visión artificial. La versión 1.6.0 elimina los bypass triviales mediante HTML, el replay y la enumeración práctica del mismo desafío, pero en sitios de alto riesgo debe combinarse con WordPress y PHP actualizados, moderación, reputación o antispam, límites del servidor y, cuando proceda, un WAF.

Historial y licencia

Consulta CHANGELOG.md para el historial completo de las versiones 1.6.0 y 1.5.0.

Licencia GPL v2 o posterior.