Каков наилучший способ реализовать алгоритм ограничения скорости для веб-запросов?
-
11-09-2019 - |
Вопрос
Возможные /частичные дубликаты:
- Какой хороший алгоритм ограничения скорости?
- Метод регулирования вызывает M запросов за N секунд
- Лучший способ реализовать регулирование запросов в ASP.NET MVC?
Я ищу наилучший способ реализовать алгоритм ограничения скорости движущегося временного окна для веб-приложения, чтобы уменьшить количество спама или атак методом перебора.
Примерами использования могут быть "Максимальное количество неудачных попыток входа с данного IP-адреса за последние 5 минут", "Максимальное количество (сообщений / голосов / etc ...) за последние N минут".
Я бы предпочел использовать алгоритм движущегося временного окна, а не жесткий сброс статистики каждые X минут (например, Twitter api).
Это было бы для приложения C # / ASP.Net.
Решение
Используйте быструю хэш-таблицу на основе памяти, например кэшированный в памяти.Ключи будут целью, которую вы ограничиваете (напримерIP) и истечением срока действия каждого сохраненного значения должно быть максимальное время ограничения.
Значения, сохраненные для каждого ключа, будут содержать сериализованный список последних N попыток, которые они предприняли при выполнении действия, вместе со временем для каждой попытки.
Другие советы
Мы выяснили это Ведро для Токенов это лучший алгоритм для такого рода ограничения скорости.Он широко используется в маршрутизаторах / коммутаторах, поэтому наши специалисты по эксплуатации лучше знакомы с этой концепцией.
Просто чтобы добавить более "современный" ответ на эту проблему:Для .NET WebAPI, Вебапитротл он превосходен и, вероятно, делает все, что вы хотите, "из коробки".
Это также доступно на 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()
});
Вы находите эту страницу интересной для чтения:
http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
Раздел, на который следует обратить внимание, начинается следующим образом:
Предотвращение атаки типа "Отказ в обслуживании" (DOS)
Веб-сервисы являются наиболее привлекательной целью для хакеров, потому что даже хакер дошкольного возраста может вывести сервер из строя, многократно вызывая веб-сервис, который выполняет дорогостоящую работу.
Редактировать:Аналогичный вопрос здесь:
Лучший способ реализовать регулирование запросов в ASP.NET MVC?
Я просто добавил ответ на этот вопрос Блокируйте запросы API на 5 минут, если превышен лимит скорости API.
Я использовал HttpRuntime.Cache
разрешить только 60 запросов в минуту.Превышение лимита приведет к блокировке API на следующие 5 минут.