Qual é a melhor maneira de implementar um algoritmo de limitação de taxa para solicitações da web?
-
11-09-2019 - |
Pergunta
Possíveis / duplicatas parciais:
- O que é um algoritmo de limitar taxa de bom?
- Estrangulamento chamadas de método para solicitações M em N segundos
- Melhor forma de implementar pedido de estrangulamento em ASP. NET MVC?
Eu estou procurando a melhor maneira de implementar uma taxa janela de tempo movendo limitando algoritmo para uma aplicação Web para reduzir o spam ou ataques de força bruta.
Os exemplos de uso seria "Número máximo de tentativas de login de um determinado IP nos últimos 5 minutos", "Número máximo de (posts / votos / etc ...) nos últimos minutos n".
Eu preferiria usar um algoritmo de janela de tempo em movimento, em vez de um hard reset das estatísticas a cada X minutos (como API do Twitter).
Isso seria para um aplicativo C # / ASP.Net.
Solução
Use uma tabela hash baseado em memória rápida como memcached . As chaves serão o alvo você está limitando (por exemplo, um IP) e da expiração de cada valor armazenado deve ser o tempo limite máximo.
Os valores armazenados para cada chave irá conter uma lista serializada das últimas tentativas N que eles fizeram em executar a ação, juntamente com o tempo para cada tentativa.
Outras dicas
Nós descobrimos Token Bucket é melhor algoritmo para este tipo de taxa-limitante. É amplamente usado em roteadores / desliga para que os nossos povos de operação estão mais familiarizados com o conceito.
Apenas para adicionar uma resposta mais 'moderno' para este problema: Para .NET WebAPI, WebApiThrottle é excelente e, provavelmente, faz tudo o que você quer fora da caixa.
É também acessível em NuGet .
Implementação leva apenas um minuto ou assim e é altamente personalizável:
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()
});
Você encontra esta página para ser uma leitura interessante:
http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
A seção de olhar para fora começa da seguinte forma:
Prevent Denial of Service (DoS)
Os serviços Web são o alvo mais atraente para hackers porque mesmo um hacker pré-escolar pode derrubar um servidor chamando repetidamente um serviço Web que funciona caro.
EDIT: pergunta homóloga aqui:
Melhor forma de implementar pedido de estrangulamento em ASP. NET MVC?
Eu só acrescentou a resposta para a pergunta solicitações de API Bloco para 5 minutos, se limite de taxa de API excede.
Eu costumava HttpRuntime.Cache
permite apenas 60 solicitações por minuto. Exceder o limite irá bloquear a API para próximos 5 minutos.