Почему это работает
Кэш ищет готовый ответ по ключу, в который обычно входит полный адрес вместе со строкой запроса. Для кэша /catalog/?a=1 и /catalog/?a=2 — две разные страницы, хотя сайт игнорирует параметр a и отдаёт одно и то же. Каждый уникальный адрес — промах кэша, а значит, полная генерация страницы на сервере с запросами к базе. Часто атакуют сразу и сам кэш: миллионы уникальных ключей вытесняют из него настоящие страницы, и после атаки сайт какое-то время работает медленнее обычного.
Как распознать
- Резкий рост доли промахов кэша при обычном составе страниц.
- Запросы к одной странице с разными бессмысленными параметрами.
- Параметры, которые не использует ваш сайт, или значения, похожие на случайные строки и метки времени.
- Рост нагрузки на базу данных при почти неизменном числе посетителей в аналитике.
Отличие от легитимных запросов
Уникальные адреса создают и обычные посетители: метки utm_ и yclid из рекламы, параметры фильтров каталога, идентификаторы сессий в старых CMS. Разница — в наборе параметров. Рекламные метки и фильтры повторяются и известны заранее, а при атаке параметры случайные, бессмысленные для сайта и почти никогда не повторяются.
Защита
- Нормализация ключа кэша. Неизвестные параметры отбрасываются при формировании ключа, и запросы снова попадают в кэш — см. кэширование.
- Белый список параметров. Для каталога разрешены только реальные параметры фильтров и сортировки.
- Лимиты на уникальные адреса с одного источника — см. ограничение скорости.
- Проверка браузера для клиентов, которые генерируют много промахов кэша подряд.
# nginx: для страниц, которые не зависят от параметров, ключ кэша без строки запроса
location /about/ {
proxy_cache pages;
proxy_cache_key "$scheme$host$uri";
proxy_pass http://backend;
}Вопросы и ответы
Не сломает ли нормализация метки рекламных кампаний?
Метки вроде utm_ отбрасываются только при формировании ключа кэша, а до вашего сервера и систем аналитики доходят без изменений.
Что делать, если на сайте нет кэша?
Тогда обход кэша не нужен: каждый запрос и так доходит до сервера, и сайт уязвим к обычному HTTP-флуду. Начать стоит с кэширования страниц, которые одинаковы для всех посетителей.
Как быть с поиском, где параметры действительно уникальные?
Поиск по определению плохо кэшируется, поэтому его защищают лимитами на сессию и проверкой браузера для подозрительных источников, а не кэшем.
Читайте также
- ВозможностиКэширование и ускорение сайтаОтдача статики и страниц с узлов фильтрации
- АтакиHTTP-флуд: что это и как защититьсяМассовые запросы к страницам, которые перегружают сервер
- ВозможностиОграничение скорости запросовОтдельные лимиты для поиска, корзины, входа и API
- База знанийКак сайту выдержать пиковую нагрузкуПодготовка к распродажам и рекламным пикам