Was ist der beste Weg, um einen geschwindigkeitsbegrenzenden Algorithmus für Web-Anforderungen zu implementieren?

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

Frage

Mögliche / Teil-Duplikate:

Ich bin auf der Suche nach dem besten Weg ein sich bewegendes Zeitfenster Rate Limiting-Algorithmus für eine Web-Anwendung zu implementieren Spam oder Brute-Force-Angriffe zu reduzieren.

Anwendungsbeispiele würden „Maximale Anzahl fehlgeschlagener Anmeldeversuche von einer bestimmten IP in den letzten 5 Minuten“ seine „Maximale Anzahl (Beiträge / Stimmen / etc ...) in den letzten N Minuten“.

Ich würde es vorziehen, ein sich bewegendes Zeitfenster-Algorithmus zu verwenden, anstatt einen Hard-Reset der Statistik alle X Minuten (wie twitter api).

Dies würde für eine C # / ASP.Net app sein.

War es hilfreich?

Lösung

Verwenden Sie einen schnellen Speicher-basierten Hash-Tabelle wie Memcached . Die Tasten werden das Ziel, das Sie (beispielsweise ein IP) und der jeweils nach Ablauf eines gespeicherten Wertes begrenzen sollte die maximale Begrenzung der Zeit sein.

Die für jede Taste gespeicherten Werte werden eine serialisierte Liste der letzten N Versuche enthalten sie bei der Durchführung der Aktion gemacht, zusammen mit der Zeit für jeden Versuch.

Andere Tipps

Wir fanden heraus, Token Bucket besseren Algorithmus für diese Art von geschwindigkeitsbestimmend ist. Es ist weit verbreitet in Routern / Switches so unser Betrieb Leute mehr mit dem Konzept vertraut sind.

Nur eine 'moderne' Antwort auf dieses Problem hinzuzufügen: Für .NET WebAPI, WebApiThrottle ist ausgezeichnet und wahrscheinlich tut alles, was Sie aus dem Kasten heraus wollen.

Es ist auch auf NuGet .

Die Umsetzung dauert nur eine Minute oder so, und es ist sehr anpassbar:

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()
});

Sie finden diese Seite eine interessante Lektüre sein:

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

Der Abschnitt beginnt zu sehen wie folgt aus:

  

Prevent Denial of Service (DoS)

     

Web-Services sind das attraktivste Ziel für Hacker, denn selbst ein Vorschul-Hacker durch wiederholtes Aufrufen eines Web-Service einen Server bringen können, die teure Arbeit der Fall ist.

EDIT: ähnliche Frage hier:

Der beste Weg Anfrage Drosselung in ASP zu implementieren. NET MVC?

Habe ich nur noch die Antwort auf die Frage: Block-API-Anforderungen für 5 Minuten, wenn API Ratengrenze übersteigt.
 Früher habe ich HttpRuntime.Cache nur 60 Anfragen pro Minute zu ermöglichen. die Grenze überschreitet, wird die API für die nächsten 5 Minuten blockieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top