2009-09-20 21 views
24

doublons possibles/partiels:Quelle est la meilleure façon d'implémenter un algorithme de limitation de débit pour les requêtes Web?

Je cherche la meilleure façon de mettre en œuvre un taux de fenêtre temporelle mobile limitant l'algorithme pour une application Web pour réduire attaques de spam ou de force brute. Des exemples d'utilisation seraient "Nombre maximum de tentatives de connexion échouées d'une adresse IP donnée dans les 5 dernières minutes", "Nombre maximum de (messages/votes/etc ...) dans les N dernières minutes".

Je préférerais utiliser un algorithme de fenêtre de temps en mouvement, plutôt qu'une réinitialisation matérielle des statistiques toutes les X minutes (comme Twitter api).

Ce serait pour une application C#/ASP.Net.

+0

Je ne pense pas que les doublons fournis répondent vraiment à cette question avec une inclinaison asp.net/c#. – spender

+0

@spender: d'où ce mot "possible" ;-) – Argalatyr

+0

A été vraiment dirigé vers l'électeur "proche" plutôt que le contenu original de la question. – spender

Répondre

10

Utilisez une table de hachage rapide basée sur la mémoire telle que memcached. Les clés seront la cible que vous limitez (par exemple une adresse IP) et l'expiration de chaque valeur stockée devrait être le temps de limitation maximum.

Les valeurs stockées pour chaque clé contiennent une liste sérialisée des N dernières tentatives effectuées lors de l'exécution de l'action, ainsi que l'heure de chaque tentative.

+2

Donc, pour chaque tentative, je désérialiser la liste en cache, couper les entrées en dehors de la fenêtre de temps, ajouter une nouvelle entrée, compter les éléments, et mettre à jour le cache? – Lamar

+0

@Lamar Vous pouvez utiliser Redis au lieu de Memcached. Redis a construit un support pour les listes et get-first et get-last - je pense qu'avec Redis vous n'aurez pas besoin de désérialiser toute la liste. Google pour "redis rate limit" – KajMagnus

+0

@KajMagnus Redis est certainement la bonne solution pour cela. Soutenez les listes et appliquez-les pour noter le travail limitant très bien ensemble. – Lamar

23

Nous avons trouvé Token Bucket est meilleur algorithme pour ce genre de limitation de débit. Il est largement utilisé dans les routeurs/commutateurs de sorte que nos gens d'opération sont plus familiers avec le concept.

2

Vous trouvez cette page pour être une lecture intéressante:

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

La section à surveiller commence comme suit:

Prévenir par déni de service (DoS)

Les services Web sont la cible la plus attrayante pour les pirates, car même un pirate d'âge préscolaire peut faire tomber un service r en appelant à plusieurs reprises un service Web qui fait un travail coûteux.

EDIT: question similaire ici:

Best way to implement request throttling in ASP.NET MVC?

5

Juste pour ajouter une réponse plus 'moderne' à ce problème: Pour .NET WebAPI, WebApiThrottle est excellent et fait probablement tout ce que vous voulez sur la boîte.

C'est également available on NuGet.

La mise en œuvre ne prend qu'une minute ou deux et il est hautement personnalisable:

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