Каков наилучший способ реализовать алгоритм ограничения скорости для веб-запросов?

StackOverflow https://stackoverflow.com/questions/1450217

Вопрос

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

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

Примерами использования могут быть "Максимальное количество неудачных попыток входа с данного 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 минут.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top