Как я могу ограничить количество запросов в минуту на веб-сервере (Flask)

#flask #ddos

Вопрос:

Я хочу сделать анти-ddos. Я хочу сделать так, чтобы, если за одну минуту будет сделано более 45 запросов, запрошенный ip-адрес будет занесен в черный список на 30 минут.

Как я могу сделать это с помощью колбы, без бд

Комментарии:

1. Вы не можете предотвратить DDOS-атаку. Это просто ограничение скорости для конечных точек.

2. ах, значит, вы хотите, чтобы один человек в крупной компании / общежитии / университете / целой стране за маршрутизатором NAT / точкой доступа Wi-Fi моделью DSL / NAT класса оператора мог заблокировать все 1000 / 2000 / 10000 / 1000000 пользователи? Потому что это прозвучало бы так, как будто один человек может отказать всем остальным в ваших услугах, сделав 46 запросов.

3. @Маркус Мюллер, чувак, нет, запрети только тот ip, который запрашивал это

4. @jwu Чувак, вся компания / общежитие / университет / страна имеет один-единственный внешний IP-адрес. Прочитайте: en.wikipedia.org/wiki/Carrier-grade_NAT

5. @jwu Используйте такую услугу, как Cloudflare

Ответ №1:

Если вам нужна защита от DDOS-атак, используйте такую услугу, как Cloudflare. Ограничение скорости не поможет остановить DDOS-атаки.

Ответ №2:

Я не буду рекомендовать ограничивать только скорость, это просто не поможет вам, если злоумышленник использует прокси-серверы и может устанавливать запросы в секунду для каждого прокси-сервера. Я бы рекомендовал использовать Cloudflare с вызовами (js challenges), вы также можете ограничить свои запросы там на 0,05 доллара за каждые 10000 законных запросов.

Ответ №3:

Ограничение скорости на основе IP:

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

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

Кстати, вы знаете, как называется программное обеспечение, которое контролирует таблицу и может дать вам ответы на такие вопросы, как «какая последняя запись для этого ключа?»?
Это база данных. Ваша проблема заключается в том, что требуется нечто похожее на базу данных.

Комментарии:

1. Да, я знаю, что такое база данных

2. да, но дело в том, что проблема, которую вы описываете, на самом деле описывает базу данных, но вы определяете, что база данных не является решением. мое замечание было сделано для того, чтобы указать, что у вас может возникнуть некоторое недопонимание того, насколько сложной должна быть база данных. Не все нуждается в кластере MariaSQL! Для вашего приложения вполне подойдет простой экземпляр SQLite.