Skip to content

v0.4.4

Choose a tag to compare

@fabiomb fabiomb released this 29 Sep 21:50
· 33 commits to main since this release

Nuevo: Rutas trampa (#8)

Rutas que ningún visitante legítimo pide pero que todo scanner automatizado prueba (/.env, copias de wp-config.php, /.git/, /.aws/, /phpinfo.php, /vendor/phpunit/). Quien pide una queda bloqueado de inmediato y por 24 horas, sin pasar por la puntuación de riesgo: la señal es inequívoca.

  • WPS_Honeypot (nuevo): corre en la Capa 1, antes de que WordPress procese la ruta, para las peticiones sin cookie de sesión. En la Capa 2 se vuelve a revisar con los permisos reales del usuario: un usuario con permisos de edición nunca se bloquea a sí mismo, y una cookie de sesión falsa no alcanza para esquivar la trampa. La whitelist y el propio servidor también quedan exentos.
  • Ajustes en Configuración → Firewall Avanzado: activar o desactivar (activado por defecto), la lista de rutas (una por línea; se compara el final de la ruta sin distinguir mayúsculas, y un * final abarca todo lo que haya debajo) y la duración del bloqueo.
  • Nuevo tipo de evento «Ruta trampa» (crítico) y tipo de bloqueo auto_honeypot. En IPv6 se bloquea la red del prefijo configurado, como el resto de los bloqueos automáticos.
  • Bloqueos: la lista muestra ahora etiquetas legibles también para los bloqueos por crawler falso, motor de riesgo y reglas personalizadas, que antes aparecían con su clave interna.

Nuevo: Campo trampa y tiempo mínimo en login y comentarios (#9)

Frena bots en wp-login.php, wp_login_form() y los comentarios, sin captcha ni servicios externos.

  • WPS_Form_Guard (nuevo): agrega a los formularios un campo oculto (a la vista y a lectores de pantalla) que los bots completan y un humano no, y la hora de carga firmada con HMAC. Un envío con el campo trampa completo o más rápido que el mínimo se rechaza, y se registra el nuevo evento «Bot en formulario».
  • Comentarios: tiempo mínimo de 3 segundos por defecto. Un comentario sin los campos del plugin (un bot que postea directo, o una página cacheada desde antes de activar la función) va a la cola de spam en lugar de rechazarse, así no se pierde ningún comentario legítimo. Trackbacks y pingbacks no se revisan.
  • Login: el tiempo mínimo viene desactivado, porque los gestores de contraseñas con envío automático completan el formulario en menos de un segundo; el campo trampa sí está activo. Un login sin los campos del plugin se deja pasar, porque los formularios de login de temas y plugins (por ejemplo, el de WooCommerce) no usan los hooks estándar. El rechazo cuenta como login fallido para el límite de intentos.
  • Exenciones: usuarios logueados (en comentarios), whitelist, el propio servidor, y todo mientras el Modo Inseguro o WPS_DISABLE_BLOCKING estén activos. No se bloquea la IP, sólo el envío.
  • Ajustes en Configuración → Firewall Avanzado: activar o desactivar (activado por defecto) y los tiempos mínimos de comentarios y login.

Seguridad: Recuperación de contraseña y registro sin límite, y mensajes que revelaban cuentas (#10)

El formulario de recuperación de contraseña y el de registro no tenían límite: servían para inundar de mails a los usuarios y para crear cuentas basura en masa. Además, los propios mensajes de WordPress permitían saber qué cuentas existen: el login respondía «The username X is not registered on this site» o «The password you entered for the username X is incorrect», y la recuperación, «There is no account with that username or email address».

  • Límites por cliente (Configuración → Rate Limiting): 5 recuperaciones de contraseña y 3 registros por hora. Al superarlos se rechaza el pedido, pero no se bloquea la IP: quien olvidó su contraseña y apretó el botón varias veces sigue pudiendo usar el sitio. WPS_Rate_Limiter::exceeds() (nuevo) cuenta sin bloquear.
  • Mensajes uniformes (con «Bloquear enumeración de usuarios» activo, el valor por defecto):
    • Login: los errores de usuario inexistente, email inexistente y contraseña incorrecta se reemplazan por un único mensaje (filtro wp_login_errors). Los demás errores, como un campo vacío, se mantienen.
    • Recuperación de contraseña: si la cuenta no existe, se responde igual que si existiera, con la redirección a «revisá tu correo».
  • Alcance: aplica a wp-login.php y al registro de WordPress. Los formularios propios de otros plugins (por ejemplo, la cuenta de WooCommerce) muestran sus propios mensajes.

Nuevo: Límite de búsquedas (#11)

Cada búsqueda del sitio es una consulta cara a la base de datos que ninguna cache de páginas absorbe, porque cada término es distinto: un script que busca términos al azar satura el servidor con muy pocas peticiones.

  • WPS_Search_Guard (nuevo): cuenta las búsquedas por cliente, en el buscador del sitio (?s=) y en la REST API (/wp/v2/search y cualquier ruta con el parámetro search). El control corre antes de que WordPress ejecute la consulta (parse_request y rest_pre_dispatch), así que una búsqueda rechazada no llega a la base de datos.
  • Límite de 20 búsquedas por minuto (Configuración → Rate Limiting, 0 lo desactiva). Al superarlo se responde 429 con Retry-After: 60, sin bloquear la IP: el visitante puede seguir navegando.
  • Quedan exentos quienes editan el sitio, la whitelist, el propio servidor, y todo mientras el bloqueo esté suspendido.

Versión

  • Versión actualizada a 0.4.4 en la cabecera del plugin, la constante WPS_VERSION y el MU-plugin. Al actualizar, la migración completa los ajustes nuevos (rutas trampa, protección de formularios y los límites de búsqueda, recuperación de contraseña y registro) con sus valores por defecto.