Como faço para bloquear solicitações de repepicação? Devo fazer isso com o Apache2 config ou .htaccess?

1

Eu quero bloquear as mesmas solicitações repetidas no meu site. Por exemplo, alguém acessa o botão "Atualizar" 3 vezes, portanto, eu quero que as mesmas solicitações depois desse usuário sejam bloqueadas automaticamente.

Eu sei que posso fazer isso com PHP ou qualquer outra linguagem de programação do lado do servidor, mas existe alguma solução "portátil" independente do website, como a configuração do Apache2 ou a regra do iptables?

Existem outros métodos de proteção básica?

    
por aexl 16.08.2012 / 09:45

1 resposta

2

Tenho certeza que se você pudesse fazer isso funcionar no iptables, seria uma idéia muito ruim. O iptables entende as camadas 3 e 4 do modelo OSI ; Solicitações HTTP estão na camada 7.

Como o HTTP é um protocolo sem estado e você está tentando fornecer uma resposta diferente com base no estado atual, você precisará de algum método para controlar o estado. A maneira normal de fazer isso é com cookies, embora essa não seja a única maneira de acompanhar o estado. mod_rewrite tem a capacidade de definir e ler cookies e combiná-los com expressões regulares, então tentaremos primeiro.

Você pode usar essas regras para fazer com que qualquer solicitação de página seja muito cedo após a outra ser bloqueada:

RewriteRule (\.html|\.php)$ - [CO=recent:true:example.com:1:/]

RewriteCond %{HTTP_COOKIE} recent=true
RewriteRule (\.html|\.php)$ - [F]

A primeira regra faz com que um cookie seja definido para cada .html ou .php página com um tempo de expiração de um minuto. O próximo par ou regra faz com que qualquer solicitação de uma página .php ou .html com esse cookie (ou seja, dentro de um minuto) seja rejeitada. Depois de um minuto, o cookie deve expirar e não ser mais enviado.

Há desvantagens aqui: ele não se restringe à mesma URL, portanto, cada solicitação de página deve ser um minuto após a anterior e o tempo de expiração é em minutos, portanto, um minuto é o menor tempo possível. Você está limitado a 403 respostas que não são necessariamente muito amigáveis ou informativas. Isso é o melhor que consigo gerenciar com o Apache. O nginx tem uma linguagem de configuração mais semelhante à programação, que permite fazer a comparação de URI necessária para bloquear apenas as atualizações de página e não outras solicitações.

Usando PHP (ou qualquer outro) para colocar a URL atual e o registro de data e hora na sessão (ou armazenar o endereço IP e a porta de origem em um banco de dados juntamente com a URL e o registro de data / hora atuais. Você faria isso se seus clientes não suportassem cookies.) permitiria que você fizesse a comparação. Se o URL atual e o da sessão forem os mesmos, e o registro de data e hora estiver dentro de algum limite do horário atual, você poderá enviar uma resposta diferente. Com o PHP (em oposição ao Apache) você poderia enviar uma resposta 503 (que faz mais sentido) com algum texto apropriado para explicar por que eles estão obtendo essa resposta em vez da página que esperavam.

A melhor opção na minha cabeça é JavaScript e / ou ligação de chave. Ligue as teclas que fazem uma atualização (Cmd + R em um Mac, Ctrl + R, F5 em todos os lugares) para que você possa interceptá-las e usar o Javascript para sugerir que o usuário espere um pouco mais antes de apertar a atualização. Esta opção tem a melhor experiência do usuário e tem o menor impacto no seu servidor.

    
por 18.08.2012 / 14:52