Каков наилучший способ реализации алгоритма ограничения скорости для веб-запросов? - PullRequest
27 голосов
/ 20 сентября 2009

Возможные / частичные дубликаты:

Я ищу лучший способ реализации алгоритма ограничения скорости перемещения во временном окне для веб-приложения, чтобы уменьшить количество спам-атак или переборов.

Примерами использования могут быть «Максимальное количество неудачных попыток входа с данного IP-адреса за последние 5 минут», «Максимальное количество (сообщений / голосов / и т. Д.) За последние N минут».

Я бы предпочел использовать алгоритм скользящего временного окна, а не полный сброс статистики каждые X минут (например, Twitter API).

Это будет для приложения на C # / ASP.Net.

Ответы [ 5 ]

23 голосов
/ 20 сентября 2009

Мы выяснили Token Bucket - лучший алгоритм для этого типа ограничения скорости. Он широко используется в маршрутизаторах / коммутаторах, поэтому наши сотрудники больше знакомы с этой концепцией.

10 голосов
/ 20 сентября 2009

Используйте быструю основанную на памяти хеш-таблицу, такую ​​как memcached . Ключи будут целью, которую вы ограничиваете (например, IP), и срок действия каждого сохраненного значения должен быть максимальным временем ограничения.

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

8 голосов
/ 25 августа 2016

Просто добавьте более «современный» ответ на эту проблему: для .NET WebAPI WebApiThrottle отлично и, вероятно, делает все, что вы хотите из коробки.

Это также доступно на NuGet .

Реализация занимает около минуты или около того, и это очень настраиваемый:

config.MessageHandlers.Add(new ThrottlingHandler()
{
    Policy = new ThrottlePolicy(perSecond: 1, perMinute: 30, perHour: 500, perDay:2000)
    {
        IpThrottling = true,
        ClientThrottling = true,
        EndpointThrottling = true
    },
    Repository = new CacheRepository()
});
2 голосов
/ 20 сентября 2009

Вы находите эту страницу интересной для чтения:

http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

Секция для поиска начинается следующим образом:

Предотвратить атаку отказа в обслуживании (DOS)

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

РЕДАКТИРОВАТЬ: Подобный вопрос здесь:

Лучший способ реализовать регулирование запросов в ASP.NET MVC?

0 голосов
/ 04 марта 2017

Я только что добавил ответ на вопрос Блокировка запросов API на 5 минут, если ограничение скорости API превышает.
Я использовал HttpRuntime.Cache, чтобы разрешить только 60 запросов в минуту. Превышение лимита заблокирует API на следующие 5 минут.

...