К содержимому
DDoS·Protect
Атаки

Обход кэша

Кэш защищает сервер от нагрузки, только если запросы одинаковые. Атакующие знают это и добавляют к адресу случайные параметры: каждый запрос становится уникальным, кэш не срабатывает, и вся нагрузка ложится на сервер.

Почему это работает

Кэш ищет готовый ответ по ключу, в который обычно входит полный адрес вместе со строкой запроса. Для кэша /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-флуду. Начать стоит с кэширования страниц, которые одинаковы для всех посетителей.

Как быть с поиском, где параметры действительно уникальные?

Поиск по определению плохо кэшируется, поэтому его защищают лимитами на сессию и проверкой браузера для подозрительных источников, а не кэшем.

Ранний доступ

Подключим ваш сайт одним из первых

Сервис готовится к запуску. Оставьте заявку: проверим, от чего нужно защищать ваш проект, и подключим его в числе первых на условиях раннего доступа.