Quelle est la meilleure façon de mettre en œuvre un algorithme de limitation de vitesse pour les demandes Web?

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

Question

doublons possibles / partiel:

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 les attaques de spam ou la force brute.

Exemples d'utilisation seraient « Le nombre maximum de tentatives de connexion infructueuses à partir d'une adresse IP donnée au cours des 5 dernières minutes », « Nombre maximum de (messages / votes / etc ...) dans les dernières minutes N ».

Je préférerais utiliser un algorithme de fenêtre de temps en mouvement, au lieu d'un redémarrage à froid des statistiques toutes les minutes X (comme twitter api).

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

Était-ce utile?

La solution

Utilisez une table de hachage à base de mémoire rapide comme memcached. Les clés seront la cible que vous limiterez (par exemple une adresse IP) et l'expiration de chaque valeur stockée doit être le temps maximum de prescription.

Les valeurs stockées pour chaque clé contiendra une liste sérialisé des dernières N tentatives qu'ils ont faites à l'exécution de l'action, ainsi que le temps pour chaque tentative.

Autres conseils

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

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 sortir de la boîte.

Il est également disponible sur 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()
});

Vous trouverez 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 parce que même un hacker préscolaire peut faire tomber un serveur en appelant à plusieurs reprises un service Web qui fonctionne coûteux.

EDIT: question similaire ici:

La meilleure façon de mettre en œuvre la limitation de la demande en ASP. NET MVC?

Je viens d'ajouter la réponse à la question demandes API bloc de 5 minutes si la limite de taux d'API dépasse.
 Je HttpRuntime.Cache pour permettre seulement 60 requêtes par minute. Dépasser la limite bloque l'API pour les 5 prochaines minutes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top