Об этом проекте

Laravel Scanner Guard — это Composer-пакет для приложений Laravel, который выявляет и блокирует автоматизированный трафик сканеров уязвимостей, достигающий роутера фреймворка. Он нацелен на типичные пути зондирования, такие как /wp-admin, /wp-login, /.git/config, /phpmyadmin и /wp-json, подсчитывая повторные попадания по каждому IP и выдавая бан при достижении настраиваемого порога в пределах временного окна. Забаненные IP получают немедленный ответ (по умолчанию 404), чтобы избежать затрат на полную загрузку фреймворка, маршрутизацию и рендеринг представлений. Пакет регистрирует псевдоним middleware маршрута scanner-guard, который разработчик вручную прикрепляет к группе middleware или конкретным маршрутам. Конфигурация включает ban_threshold, ban_window, ban_duration, scanner_paths (подстановочные знаки в стиле fnmatch) и response_status. Он явно не обрабатывает запросы к буквально несуществующим .php-файлам, которые отсекаются на уровне nginx/PHP-FPM до загрузки Laravel — для них требуется исправление try_files в nginx. Опциональная блокировка по ASN позволяет полностью блокировать целые сети (например, AS16276/OVH), используя разрешение GeoIP, делегированное драйверам ip_api или maxmind из laravel-visitor-fingerprint. Когда блок-лист пуст, поиск GeoIP не выполняется, что не добавляет задержки. Каждый бан записывает строку аудита в scanner_guard_bans с полями reason, matched_value, hit_count, banned_at и expires_at. База данных хранит только хеш IP с солью (никогда не сырой адрес); сырой IP кэшируется отдельно с TTL, равным ban_duration, для целей экспорта в nginx. Artisan-команда export-denylist записывает активные баны в виде строк deny для nginx, с опциональной ежедневной автосинхронизацией. Пакет поддерживает три драйвера: database (по умолчанию, с аудитом и статистикой), http (пересылает баны в центральное приложение через подписанный HMAC JSON POST, обеспечивая архитектуру «хаб-и-спутники») и cache (только бан, без персистентности). Ежедневная агрегированная статистика (bans_count, hits_total, reason_stats, top_matched_values) записывается в момент бана и сохраняется после удаления строк бана. Команда aggregate-and-prune согласовывает статистику, очищает истёкшие баны и обеспечивает соблюдение срока хранения (по умолчанию 90 дней), самостоятельно запускаясь ежедневно по умолчанию.