Qual é a melhor maneira de implementar um algoritmo de limitação de taxa para solicitações da web?

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

Pergunta

Possíveis / duplicatas parciais:

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top