Sobre el proyecto

Laravel Scanner Guard es un paquete de Composer para aplicaciones Laravel que identifica y bloquea el tráfico automatizado de escáneres de vulnerabilidades que llega al enrutador del framework. Se dirige a rutas de sondeo comunes como /wp-admin, /wp-login, /.git/config, /phpmyadmin y /wp-json, contando los impactos repetidos por IP y emitiendo un bloqueo una vez que se alcanza un umbral configurable dentro de una ventana de tiempo. Las IP bloqueadas reciben una respuesta inmediata (404 por defecto) para evitar el coste del arranque completo del framework, el enrutamiento y el renderizado de vistas. El paquete registra un alias de middleware de ruta scanner-guard que el desarrollador adjunta manualmente a un grupo de middleware o a rutas específicas. La configuración incluye ban_threshold, ban_window, ban_duration, scanner_paths (comodines estilo fnmatch) y response_status. Explícitamente no gestiona solicitudes de archivos .php inexistentes literales que fallan en la capa de nginx/PHP-FPM antes de que arranque Laravel; esas requieren una corrección de try_files en nginx. La inclusión opcional de ASN en la lista de bloqueo permite bloquear por completo redes enteras (por ejemplo, AS16276/OVH) usando resolución GeoIP delegada a los controladores ip_api o maxmind de laravel-visitor-fingerprint. Cuando la lista de bloqueo está vacía, no se realiza ninguna consulta GeoIP, lo que añade latencia cero. Cada bloqueo escribe una fila de auditoría en scanner_guard_bans con reason, matched_value, hit_count, banned_at y expires_at. La base de datos almacena únicamente un hash con sal de la IP (nunca la dirección sin procesar); la IP sin procesar se almacena en caché por separado con un TTL igual a ban_duration para fines de exportación a nginx. Un comando Artisan export-denylist escribe los bloqueos activos como líneas deny de nginx, con sincronización automática diaria opcional. El paquete admite tres controladores: database (por defecto, con pista de auditoría y estadísticas), http (reenvía los bloqueos a una aplicación central mediante POST JSON firmado con HMAC, lo que permite una arquitectura de concentrador y satélites) y cache (solo bloqueo, sin persistencia). Las estadísticas agregadas diarias (bans_count, hits_total, reason_stats, top_matched_values) se registran en el momento del bloqueo y sobreviven a la eliminación de la fila de bloqueo. Un comando aggregate-and-prune reconcilia las estadísticas, purga los bloqueos caducados y aplica la retención (90 días por defecto), autoprogramándose diariamente de forma predeterminada.