Como posso implementar taxa do lado do servidor limitante para um serviço web Perl?

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

  •  20-08-2019
  •  | 
  •  

Pergunta

Eu tenho um CGI baseado em Perl / Fast serviço CGI web e quer clientes taxa-limite por endereço IP para parar de clientes agressivos causando muito trabalho.

Eu olhei em torno de algum código e encontrou Algorithm :: token bucket no CPAN mas isso é para pedidos de clientes; ele não tem persistência e não tem nenhuma configuração por usuário, portanto, não é realmente útil para a taxa do lado do servidor limitante.

Eu estou procurando sugestões de algo que já existe, caso contrário, eu vou ter de fazer a minha própria com base em algumas simples de persistência, como laço de DB_File por endereço IP e alguns trabalho em lotes que faz a gestão de token.

Foi útil?

Solução

Eu usei Cache :: FastMmap para a taxa de limitação, acompanhando sucessos por endereço IP. É um cache para os dados expiram ao longo do tempo, mas se você definir o tamanho e expirar certo tempo, isso não deve ser um problema.

O endereço IP é a chave de hash eo valor hash é uma série de marcas de tempo. I tem uma segunda estrutura de dados (também apoiado por cache :: FastMMap ) que é um de hash de endereços IP proibidos, atualizado de acordo com os dados da primeira estrutura.

Outras dicas

Eu sei que não é o que você pediu, mas você já pensou manipulação isso em outro lugar na pilha onde já foi feito para você? É evidente que eu não sei o seu stack implantação, mas se é apache você poderia usar mod_evasive . Alternativamente, se você estiver no Linux você poderia deixar iptables fazer o seu trabalho usando algo como:

#Allow only 12 connections per IP
/sbin/iptables -A INPUT -p tcp --dport 80 -m conn-limit --connlimit-above 12 -j REJECT --reject-with tcp-reset

regras certamente mais complicados são possíveis.

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