Pergunta

Tenho controle sobre o HttpServer, mas não sobre o ApplicationServer ou os aplicativos Java que estão lá, mas preciso bloquear o acesso direto a determinadas páginas desses aplicativos.Precisamente, não quero que os usuários automatizem o acesso a formulários emitindo solicitações HTTP GET/POST diretas para o servlet apropriado.

Então, decidi bloquear usuários com base no valor de HTTP_REFERER.Afinal, se o usuário estiver navegando dentro do site, ele terá uma adequada HTTP_REFERER.Bom, foi isso que pensei.

Implementei uma regra de reescrita no arquivo .htaccess que diz:

RewriteEngine on 

# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
RewriteRule (servlet1|servlet2)/.+\?.+ - [F]

Eu esperava proibir o acesso a usuários que não navegassem no site, mas emitisse solicitações GET diretas para os servlets "servlet1" ou "servlet2" usando strings de consulta.Mas minhas expectativas terminaram abruptamente porque a expressão regular (servlet1|servlet2)/.+\?.+ não funcionou de jeito nenhum.

Fiquei muito desapontado quando mudei essa expressão para (servlet1|servlet2)/.+ e funcionou tão bem que meus usuários foram bloqueados independentemente de navegarem no site ou não.

Então, minha pergunta é:Como posso conseguir isso de não permitir "robôs" com acesso direto a determinadas páginas se não tenho acesso/privilégios/tempo para modificar o aplicativo?

Foi útil?

Solução

Não tenho certeza se posso resolver isso de uma só vez, mas podemos ir e voltar conforme necessário.

Primeiro, quero repetir o que acho que você está dizendo e ter certeza de que fui claro.Você deseja proibir solicitações para servlet1 e servlet2 se a solicitação não tiver o referenciador adequado e faz tem uma string de consulta?Não tenho certeza se entendi (servlet1|servlet2)/.+\?.+ porque parece que você está exigindo um arquivo em servlet1 e 2.Acho que talvez você esteja combinando PATH_INFO (antes de "?") com uma string de consulta GET (depois de "?").Parece que a parte PATH_INFO funcionará, mas o teste de consulta GET não.Fiz um teste rápido no meu servidor usando script1.cgi e script2.cgi e as regras a seguir funcionaram para realizar o que você está pedindo.Eles são obviamente editados um pouco para combinar com meu ambiente:

RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(script1|script2)\.cgi - [F]

O texto acima detectou todas as solicitações de referência errada para script1.cgi e script2.cgi que tentaram enviar dados usando uma string de consulta.No entanto, você também pode enviar dados usando path_info e postando dados.Usei este formulário para me proteger contra qualquer um dos três métodos usados ​​com referenciador incorreto:

RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
RewriteCond %{QUERY_STRING} ^.+$ [OR]
RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
RewriteCond %{PATH_INFO} ^.+$
RewriteRule ^(script1|script2)\.cgi - [F]

Com base no exemplo que você estava tentando fazer, acho que é isso que você deseja:

RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
RewriteCond %{QUERY_STRING} ^.+$ [OR]
RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
RewriteCond %{PATH_INFO} ^.+$
RewriteRule (servlet1|servlet2)\b - [F]

Esperançosamente, isso pelo menos o deixará mais perto de seu objetivo.Por favor, deixe-nos saber como funciona, estou interessado no seu problema.

(Aliás, concordo que o bloqueio de referência é uma segurança fraca, mas também entendo que a relaidade força soluções imperfeitas e parciais às vezes, o que você parece já reconhecer.)

Outras dicas

Não tenho uma solução, mas aposto que confiar no referenciador nunca funcionará porque os agentes do usuário são livres para não enviá-lo ou falsificá-lo para algo que os permita entrar.

Você não pode distinguir usuários de scripts maliciosos pela solicitação http.Mas você pode analisar quais usuários estão solicitando muitas páginas em pouco tempo e bloquear seus endereços IP.

Usar um referenciador não é confiável como método de verificação.Como outras pessoas mencionaram, é facilmente falsificado.Sua melhor solução é modificar o aplicativo (se puder)

Você pode usar um CAPTCHA ou definir algum tipo de cookie ou cookie de sessão que rastreie qual página o usuário visitou pela última vez (uma sessão seria mais difícil de falsificar) e acompanhe o histórico de visualizações da página e permita apenas usuários que navegaram no páginas necessárias para chegar à página que você deseja bloquear.

Obviamente, isso requer que você tenha acesso ao aplicativo em questão, porém é a maneira mais infalível (não completamente, mas "boa o suficiente" na minha opinião).

Javascript é outra ferramenta útil para evitar (ou pelo menos atrasar) a captura de tela.A maioria das ferramentas automatizadas de scraping não possui um interpretador Javascript, então você pode fazer coisas como definir campos ocultos, etc.

Editar:Algo na linha de este artigo de Phil Haack.

Suponho que você esteja tentando evitar a captura de tela.

Na minha opinião honesta, é difícil de resolver e tentar consertar verificando o valor de HTTP_REFERER é apenas um esparadrapo.Qualquer pessoa que se dê ao trabalho de automatizar envios será experiente o suficiente para enviar o referenciador correto de seu 'autômato'.

Você pode tentar limitar a taxa, mas sem realmente modificar o aplicativo para forçar algum tipo de validação é-este-um-humano (um CAPTCHA) em algum momento, então você achará isso difícil de evitar.

Se você está tentando impedir que bots de mecanismos de pesquisa acessem determinadas páginas, certifique-se de usar um arquivo formatado corretamente robôs.txt arquivo.

Usar HTTP_REFERER não é confiável porque é facilmente falsificado.

Outra opção é verificar a string do agente do usuário em busca de bots conhecidos (isso pode exigir modificação do código).

Para deixar as coisas um pouco mais claras:

  1. Sim, eu sei que usar HTTP_REFERER é completamente não confiável e um tanto infantil, mas tenho certeza que as pessoas que aprenderam (talvez comigo?) a fazer automações com Excel VBA não saberão como subverter um HTTP_REFERER dentro do intervalo de tempo para ter a solução final.

  2. Não tenho acesso/privilégio para modificar o código do aplicativo.Política.Você acredita nisso?Portanto, devo esperar até que o detentor dos direitos faça as alterações que solicitei.

  3. Por experiências anteriores, sei que as alterações solicitadas levarão dois meses para entrar em produção.Não, jogar livros de metodologias ágeis em suas cabeças não melhorou nada.

  4. Este é um aplicativo de intranet.Então não tenho muitos jovens tentando minar meu prestígio.Mas sou jovem o suficiente para tentar minar o prestígio de “um serviço de consultoria global muito sofisticado que vem da Índia”, mas onde, curiosamente, não há um único indiano trabalhando lá.

Até agora, a melhor resposta vem de “Michel de Mare”:bloquear usuários com base em seus IPs.Bem, isso eu fiz ontem.Hoje quis fazer algo mais genérico porque tenho muitos usuários canguru (pulando de um endereço IP para outro) porque usam VPN ou DHCP.

Você pode usar um token anti-CSRF para conseguir o que procura.

Este artigo explica isso com mais detalhes: Falsificações de solicitações entre sites

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