Jaki jest najlepszy sposób wdrożenia algorytmu ograniczania szybkości dla żądań internetowych?

Możliwe/częściowe duplikaty:

Szukam najlepszego sposobu na zaimplementowanie algorytmu ograniczania szybkości przesuwania okna czasu dla aplikacji internetowej w celu zmniejszenia ataków spamu lub brute force.

Przykłady użycia to " Maksymalna liczba nieudanych prób logowania z danego IP w ciągu ostatnich 5 minut", " Maksymalna liczba (postów/głosów / itp...) w ostatnich n minutach".

Wolałbym użyć algorytmu ruchomego okna czasowego, a nie twardego resetowania statystyk co X minut(jak twitter api).

To byłoby dla aplikacji C# / ASP. Net.

Author: Community, 2009-09-20

5 answers

Użyj szybkiej tablicy hashtable opartej na pamięci, takiej jak memcached . Klucze będą celem, który ograniczasz (np. IP), a wygaśnięcie każdej przechowywanej wartości powinno być maksymalnym czasem ograniczenia.

Wartości przechowywane dla każdego klucza będą zawierały serializowaną listę ostatnich N prób wykonania akcji wraz z czasem każdej próby.

 10
Author: Fragsworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-20 03:36:38

Dowiedzieliśmy się Token Bucket jest lepszym algorytmem do tego rodzaju ograniczania szybkości. Jest szeroko stosowany w routerach/przełącznikach, więc nasi ludzie są bardziej zaznajomieni z tą koncepcją.

 23
Author: ZZ Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-20 03:31:27

Aby dodać bardziej "nowoczesną" odpowiedź na ten problem: dla. NET WebAPI, WebApiThrottle jest doskonały i prawdopodobnie robi wszystko, co chcesz po wyjęciu z pudełka.

Jest również dostępny na NuGet .

Implementacja zajmuje tylko minutę i jest wysoce konfigurowalna:

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()
});
 7
Author: NickG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-26 21:22:07

Uważasz, że ta strona jest ciekawą lekturą:

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

Sekcja na którą należy zwrócić uwagę zaczyna się następująco:

Zapobieganie atakom typu Denial of Service (DOS)

Usługi internetowe są najbardziej atrakcyjnym celem dla hakerów, ponieważ nawet przedszkolny haker może zniszczyć serwer, wielokrotnie dzwoniąc do usługi internetowej, która wykonuje kosztowną pracę.

EDIT: podobne pytanie tutaj:

Najlepszy sposób na wdrożenie dławienia żądania w ASP.NET MVC?

 2
Author: spender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32

Właśnie dodałem odpowiedź na pytanie Blokuj żądania API przez 5 minut, jeśli limit API przekroczy.
Użyłem HttpRuntime.Cache, aby zezwolić tylko na 60 żądań na minutę. Przekroczenie limitu zablokuje API na następne 5 minut.

 0
Author: JerryGoyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:44