Detectando rastreadores 'furtivos' da web

107

Que opções existem para detectar rastreadores da web que não desejam ser detectados?

(Eu sei que as técnicas de detecção de listagem permitirão ao programador inteligente de rastreamento furtivo fazer uma aranha melhor, mas não acho que algum dia seremos capazes de bloquear rastreadores furtivos inteligentes, apenas aqueles que cometem erros.)

Não estou falando sobre os bons rastreadores como o googlebot e o Yahoo! Slurp. Eu considero um bot legal se ele:

  1. identifica-se como um bot na string do agente do usuário
  2. lê o robots.txt (e o obedece)

Estou falando sobre o rastreadores ruins , escondidos atrás de agentes de usuários comuns, usando minha largura de banda e nunca me dando nada em troca.

Existem alguns alçapões que podem ser construídos em uma lista atualizada (obrigado Chris, gs) :

  1. Adicionar um diretório listado apenas (marcado como não permitir) no robots.txt,
  2. Adicionando links invisíveis (possivelmente marcados como rel = "nofollow"?),
    • estilo = "exibir: nenhum;" no link ou container pai
    • colocado abaixo de outro elemento com maior índice z
  3. detectar quem não entende a capitalização,
  4. detectar quem tenta postar respostas, mas sempre falha no Captcha.
  5. detectar solicitações GET para recursos somente POST
  6. detectar intervalo entre pedidos
  7. detectar a ordem das páginas solicitadas
  8. detectar quem (de forma consistente) solicita recursos https em http
  9. detectar quem não solicita o arquivo de imagem (isso em combinação com uma lista de agentes de usuário de navegadores com capacidade de imagem conhecidos funciona surpreendentemente bem)

Algumas armadilhas seriam acionadas por bots 'bons' e 'ruins'. você pode combiná-los com uma lista de permissões:

  1. Isso desencadeia uma armadilha
  2. É pedido robots.txt?
  3. Ele não acionou outra armadilha porque obedeceu robots.txt

Outra coisa importante aqui é:
considere pessoas cegas usando leitores de tela: dê às pessoas uma maneira de entrar em contato com você ou resolva um Captcha (sem imagem) para continuar navegando.

Quais métodos existem para detectar automaticamente os rastreadores da web que tentam se mascarar como visitantes humanos normais.

Atualizar
A questão não é: Como faço para capturar todos os rastreadores. A questão é: como posso maximizar a chance de detectar um rastreador.

Alguns spiders são realmente bons e realmente analisam e entendem html, xhtml, css javascript, script VB etc ...
Não tenho ilusões: não vou conseguir vencê-los.

No entanto, você ficaria surpreso com o quão estúpidos alguns rastreadores são. Com o melhor exemplo de estupidez (na minha opinião) sendo: lançar todos os URLs para minúsculas antes de solicitá-los.

E então há um monte de rastreadores que 'não são bons o suficiente' para evitar os vários alçapões.

Jacco
fonte

Respostas:

15

Há algum tempo, trabalhei com uma pequena empresa de hospedagem para ajudá-los a implementar uma solução para isso. O sistema que desenvolvi examinou os logs do servidor da web para atividade excessiva de qualquer endereço IP e emitiu regras de firewall para bloquear os infratores. Incluía listas de permissões de endereços / intervalos de IP com base em http://www.iplists.com/ , que eram então atualizadas automaticamente conforme necessário, verificando as strings de user agent reivindicadas e, se o cliente alegava ser um spider legítimo, mas não na lista de permissões, ele executava pesquisas de DNS / DNS reverso para verificar se o endereço IP de origem corresponde ao proprietário reivindicado do bot. Para evitar falhas, essas ações foram relatadas ao administrador por e-mail, juntamente com links para bloquear / colocar o endereço na lista de permissões em caso de avaliação incorreta.

Não falo com aquele cliente há 6 meses ou mais, mas, pela última vez que ouvi, o sistema estava funcionando de forma bastante eficaz.

Ponto lateral: Se você está pensando em fazer um sistema de detecção semelhante com base na limitação da taxa de acerto, certifique-se de usar totais de pelo menos um minuto (e de preferência pelo menos cinco minutos). Eu vejo um monte de pessoas falando sobre esses tipos de esquemas que deseja bloquear qualquer um que encabeça 5-10 sucessos em um segundo, o que pode gerar falsos positivos em páginas com imagens pesadas (a menos que as imagens são excluídas da contagem) e vai gerar falsa positivos quando alguém como eu encontra um site interessante e deseja ler todo, então ele abre todos os links em abas para carregar em segundo plano enquanto lê o primeiro.

Dave Sherohman
fonte
5
Acho que esse falso positivo devido ao bloqueio do rastreador da web mata absolutamente o tráfego da web. Você está basicamente irritando 99,8% do seu usuário com uma tentativa ruim de impedir os rastreadores que podem facilmente ignorar esse método ingênuo descrito. Nunca é uma boa ideia negar o acesso do usuário ou impedi-lo porque isso destrói a experiência do usuário com o seu site.
KJW,
14

Veja o Projeto Honeypot - eles estão configurando bot traps em grande escala (e têm DNSRBL com seus IPs).

Use URLs e HTML complicados:

<a href="https://example.com/"> = http://example.com/ on http pages.
<a href="page&amp;&#x23;hash"> = page& + #hash

Em HTML, você pode usar muitos truques com comentários, elementos CDATA, entidades, etc:

<a href="foo<!--bar-->"> (comment should not be removed)
<script>var haha = '<a href="bot">'</script>
<script>// <!-- </script> <!--><a href="bot"> <!-->
Kornel
fonte
9

Uma solução fácil é criar um link e torná-lo invisível

<a href="iamabot.script" style="display:none;">Don't click me!</a>

É claro que você deve esperar que algumas pessoas que olham o código-fonte sigam esse link apenas para ver aonde ele leva. Mas você poderia apresentar a esses usuários um captcha ...

É claro que rastreadores válidos também seguiriam o link. Mas você não deve implementar um rel = nofollow, mas procurar o sinal de um rastreador válido. (como o agente de usuário)

Georg Schölly
fonte
1
A menos que o bot verifique os atributos CSS do link e não siga o link porque ele não é visível para um usuário humano ...
Bob Somers
1
Rotular o link "NÃO clique em mim" seria uma ideia melhor. Se alguém desativou o CSS (ou não tem suporte para CSS), o link ficará visível ..
dbr
Boa ideia. Talvez altere o texto para "." e o estilo css para combinar com o fundo - tornando-o invisível para a maioria dos usuários? Ou execute um script para ocultá-lo após 1 segundo, deixando-o visível apenas para um bot que não consegue vincular o comando javascript ocultar ao link?
Underverse
1
Cuidado com a penalidade do chapéu preto da perspectiva de SEO.
Alfred Wallace
6

Uma coisa que você não listou são usados ​​comumente para detectar rastreadores ruins.

Velocidade de acerto, bons rastreadores da web dividirão seus acessos para não inundar um site com solicitações. Os ruins farão uma das três coisas:

  1. acesse os links sequenciais um após o outro
  2. acesse links sequenciais em alguma sequência paralela (2 ou mais de cada vez).
  3. acertar links sequenciais em um intervalo fixo

Além disso, alguns programas de navegação offline irão engolir várias páginas, não tenho certeza de que tipo de limite você deseja usar para começar a bloquear por endereço IP.

Este método também detectará programas de espelhamento como fmirror ou wget.

Se o bot randomiza o intervalo de tempo, você pode verificar se os links são percorridos de maneira sequencial ou profunda, ou pode ver se o bot está percorrendo uma grande quantidade de texto (como em palavras para ler) em um período de tempo muito curto. Alguns sites também limitam o número de solicitações por hora.

Na verdade, ouvi uma ideia em algum lugar, não me lembro de onde, que se um usuário obtiver muitos dados, em termos de kilobytes, pode ser apresentado um captcha para ele provar que não é um bot. Eu nunca vi isso implementado.

Atualização sobre links ocultos

No que diz respeito a ocultar links, você pode colocar um div sob outro, com CSS (colocando-o primeiro na ordem de desenho) e possivelmente definindo a ordem z. Um bot não poderia ignorar isso, sem analisar todo o seu javascript para ver se é um menu. Até certo ponto, os links dentro de elementos DIV invisíveis também não podem ser ignorados sem que o bot analise todo o javascript.

Levando essa ideia à sua conclusão, o javascript não chamado, que poderia mostrar os elementos ocultos, poderia enganar um subconjunto de bots de análise de javascript. E não é muito trabalho para implementar.

Chris
fonte
16
Grande falha com os métodos "ignorar JavaScript significa que você é um bot": alguns de nós usam o plugin NoScript. Nenhum site executa JavaScript em mim, a menos que eu coloque o site na lista de permissões e tenha certeza de que não sou um bot.
Dave Sherohman
2
bots podem executar Javascript agora ... é 2013, pelo amor de Deus. então aí se vai toda a discussão. quem disse que os rastreadores da web visitam sites em seleções sequenciais? outra grande suposição.
KJW,
1
O javascript era apenas para mostrar o link do honeypot. A ideia é que os bots irá analisar o javascript que vai fazer um link honeypot visível, tornando-os mais propensos a seguir o link. No entanto, para um usuário real, o código que torna o link visível nunca seria executado. Assim, os usuários NoScript, junto com qualquer pessoa que não vá executar funções aleatoriamente, estariam bem. Dito isso, não sei por que / como um bot executaria código aleatoriamente e, se estivesse fazendo uma análise estática para determinar se um elemento poderia se tornar visível, seria um bot sofisticado.
Rick
4

Um método simples de detecção de bot que ouvi para formulários é a técnica de entrada oculta. Se você está tentando proteger um formulário, coloque uma entrada no formulário com um id que pareça completamente legítimo. Em seguida, use css em um arquivo externo para ocultá-lo. Ou se você for realmente paranóico, configure algo como o jquery para ocultar a caixa de entrada no carregamento da página. Se você fizer isso direito, imagino que seria muito difícil para um bot descobrir. Você sabe que esses bots têm por natureza preencher tudo em uma página, especialmente se você fornecer à sua entrada oculta uma id de algo como id = "fname", etc.

Agile Noob
fonte
2
não se os bots são capazes de esperar que o jquery termine, assim como um navegador normal pode. Isso teria funcionado bem no início dos anos 2000
KJW,
3

Na verdade, não é tão fácil acompanhar as boas strings do agente do usuário. As versões do navegador vêm e vão. Fazer uma estatística sobre strings de agente de usuário por diferentes comportamentos pode revelar coisas interessantes.

Não sei até que ponto isso poderia ser automatizado, mas pelo menos é um diferencial.

iny
fonte
3

Não testado, mas aqui está uma boa lista de user agents dos quais você pode fazer uma expressão regular. Pode levar você a maior parte do caminho:

ADSARobot|ah-ha|almaden|aktuelles|Anarchie|amzn_assoc|ASPSeek|ASSORT|ATHENS|Atomz|attach|attache|autoemailspider|BackWeb|Bandit|BatchFTP|bdfetch|big.brother|BlackWidow|bmclient|Boston\ Project|BravoBrian\ SpiderEngine\ MarcoPolo|Bot\ mailto:[email protected]|Buddy|Bullseye|bumblebee|capture|CherryPicker|ChinaClaw|CICC|clipping|Collector|Copier|Crescent|Crescent\ Internet\ ToolPak|Custo|cyberalert|DA$|Deweb|diagem|Digger|Digimarc|DIIbot|DISCo|DISCo\ Pump|DISCoFinder|Download\ Demon|Download\ Wonder|Downloader|Drip|DSurf15a|DTS.Agent|EasyDL|eCatch|ecollector|efp@gmx\.net|Email\ Extractor|EirGrabber|email|EmailCollector|EmailSiphon|EmailWolf|Express\ WebPictures|ExtractorPro|EyeNetIE|FavOrg|fastlwspider|Favorites\ Sweeper|Fetch|FEZhead|FileHound|FlashGet\ WebWasher|FlickBot|fluffy|FrontPage|GalaxyBot|Generic|Getleft|GetRight|GetSmart|GetWeb!|GetWebPage|gigabaz|Girafabot|Go\!Zilla|Go!Zilla|Go-Ahead-Got-It|GornKer|gotit|Grabber|GrabNet|Grafula|Green\ Research|grub-client|Harvest|hhjhj@yahoo|hloader|HMView|HomePageSearch|http\ generic|HTTrack|httpdown|httrack|ia_archiver|IBM_Planetwide|Image\ Stripper|Image\ Sucker|imagefetch|IncyWincy|Indy*Library|Indy\ Library|informant|Ingelin|InterGET|Internet\ Ninja|InternetLinkagent|Internet\ Ninja|InternetSeer\.com|Iria|Irvine|JBH*agent|JetCar|JOC|JOC\ Web\ Spider|JustView|KWebGet|Lachesis|larbin|LeechFTP|LexiBot|lftp|libwww|likse|Link|Link*Sleuth|LINKS\ ARoMATIZED|LinkWalker|LWP|lwp-trivial|Mag-Net|Magnet|Mac\ Finder|Mag-Net|Mass\ Downloader|MCspider|Memo|Microsoft.URL|MIDown\ tool|Mirror|Missigua\ Locator|Mister\ PiX|MMMtoCrawl\/UrlDispatcherLLL|^Mozilla$|Mozilla.*Indy|Mozilla.*NEWT|Mozilla*MSIECrawler|MS\ FrontPage*|MSFrontPage|MSIECrawler|MSProxy|multithreaddb|nationaldirectory|Navroad|NearSite|NetAnts|NetCarta|NetMechanic|netprospector|NetResearchServer|NetSpider|Net\ Vampire|NetZIP|NetZip\ Downloader|NetZippy|NEWT|NICErsPRO|Ninja|NPBot|Octopus|Offline\ Explorer|Offline\ Navigator|OpaL|Openfind|OpenTextSiteCrawler|OrangeBot|PageGrabber|Papa\ Foto|PackRat|pavuk|pcBrowser|PersonaPilot|Ping|PingALink|Pockey|Proxy|psbot|PSurf|puf|Pump|PushSite|QRVA|RealDownload|Reaper|Recorder|ReGet|replacer|RepoMonkey|Robozilla|Rover|RPT-HTTPClient|Rsync|Scooter|SearchExpress|searchhippo|searchterms\.it|Second\ Street\ Research|Seeker|Shai|Siphon|sitecheck|sitecheck.internetseer.com|SiteSnagger|SlySearch|SmartDownload|snagger|Snake|SpaceBison|Spegla|SpiderBot|sproose|SqWorm|Stripper|Sucker|SuperBot|SuperHTTP|Surfbot|SurfWalker|Szukacz|tAkeOut|tarspider|Teleport\ Pro|Templeton|TrueRobot|TV33_Mercator|UIowaCrawler|UtilMind|URLSpiderPro|URL_Spider_Pro|Vacuum|vagabondo|vayala|visibilitygap|VoidEYE|vspider|Web\ Downloader|w3mir|Web\ Data\ Extractor|Web\ Image\ Collector|Web\ Sucker|Wweb|WebAuto|WebBandit|web\.by\.mail|Webclipping|webcollage|webcollector|WebCopier|webcraft@bea|webdevil|webdownloader|Webdup|WebEMailExtrac|WebFetch|WebGo\ IS|WebHook|Webinator|WebLeacher|WEBMASTERS|WebMiner|WebMirror|webmole|WebReaper|WebSauger|Website|Website\ eXtractor|Website\ Quester|WebSnake|Webster|WebStripper|websucker|webvac|webwalk|webweasel|WebWhacker|WebZIP|Wget|Whacker|whizbang|WhosTalking|Widow|WISEbot|WWWOFFLE|x-Tractor|^Xaldon\ WebSpider|WUMPUS|Xenu|XGET|Zeus.*Webster|Zeus [NC]

Retirado de: http://perishablepress.com/press/2007/10/15/ultimate-htaccess-blacklist-2-compressed-version/

Brian Armstrong
fonte
1

Você também pode verificar referências. Nenhuma referência poderia levantar suspeitas de bot. Referência ruim significa que certamente não é um navegador.

Adicionando links invisíveis (possivelmente marcados como rel = "nofollow"?),

* style="display: none;" on link or parent container
* placed underneath another element with higher z-index

Eu não faria isso. Você pode acabar na lista negra do Google para SEO de chapéu preto :)

Marinheiro danubiano
fonte
1
O que exatamente e por que isso colocaria você na lista negra?
conteh
1

Atualmente trabalho para uma empresa que faz a varredura de sites para classificá-los. Também verificamos os sites em busca de malware.

Na minha experiência, os bloqueadores número um de nosso rastreador da web (que obviamente usa um IE ou Firefox UA e não obedece ao robots.txt. Dãããããããããããããao) são sites que hospedam malware intencionalmente. É uma dor porque o site então volta para um humano que tem que carregar manualmente o site, classificá-lo e verificar se há malware.

Só estou dizendo que, ao bloquear os rastreadores da web, você está se colocando em más companhias.

Claro, se eles são terrivelmente rudes e sugam toneladas de sua largura de banda, a história é diferente, porque você tem um bom motivo.

Zan Lynx
fonte
15
Sinto muito, mas se você executa um rastreador que não obedece ao robots.txt, você não está obedecendo às regras. Ao não obedecer às regras, você mesmo está se colocando em péssimas companhias. Ao sugerir que aplicar as regras definidas pelo proprietário do site (em robots.txt) é uma prática ruim, você está invertendo o problema erroneamente. Você basicamente afirma que não entende quem é o proprietário legítimo do conteúdo.
Jacco
11
@Jacco: Se um rastreador à procura de malware obedecesse às regras, nunca encontraria nenhum. Vá falar com os autores do malware.
Zan Lynx
5
@Jacco: Porcentagem de sites legítimos que tentam bloquear rastreadores não compatíveis? Menos de 1%. Sites de malware que tentam? Mais de 60%. Então, sim, é suspeito.
Zan Lynx
4
@Jacco na verdade não, não há proprietários de um conteúdo na web se ele for público. Alguém que está fazendo isso sem copiar e colar manualmente deve receber um prêmio, não uma punição. Todo esse conceito de copyright precisa ser abolido na internet. Apenas a inovação criativa e a confiança podem construir valor e digno da atenção das pessoas, não por alguma ameaça de véu legal opaco.
KJW,
Tudo isso indica que a pessoa que dirige o site dedica muito tempo e reflexão ao site e possui algum grau de habilidade técnica. Então é claro que isso exclui a maior parte da curva do sino.
Parthian Shot
1

As pessoas continuam abordando rastreadores abrangentes, mas não rastreadores especializados para o seu site.

Eu escrevo rastreadores invisíveis e se eles forem construídos individualmente, nenhuma quantidade de potes de mel ou links ocultos terão qualquer efeito - a única maneira real de detectar rastreadores especializados é inspecionando os padrões de conexão.

Os melhores sistemas usam AI (por exemplo, Linkedin) usam AI para resolver isso.
A solução mais fácil é escrever analisadores de log que analisam as conexões IP e simplesmente listam esses IPs ou fornecem captcha, pelo menos temporário.

por exemplo,
se o IP X for visto a cada 2 segundos conectando-se, foo.com/cars/*.htmlmas não a qualquer outra página - é mais provável que seja um bot ou um usuário avançado faminto.

Alternativamente, existem vários desafios de javascript que atuam como proteção (por exemplo, o sistema anti-bot da Cloudflare), mas esses são facilmente solucionáveis, você pode escrever algo personalizado e isso pode ser dissuasor o suficiente para fazer com que o esforço do rastreador não valha a pena.

No entanto, você deve fazer uma pergunta se está disposto a usuários legítimos falso-positivos e apresentar inconveniências para eles para evitar o tráfego de bot. Proteger dados públicos é um paradoxo impossível.

Granitosaurus
fonte
-1

resposta curta: se um programador de nível médio sabe o que está fazendo, você não será capaz de detectar um rastreador sem afetar o usuário real. Tendo suas informações publicamente, você não poderá defendê-las contra um rastreador ... é como a 1ª emenda à direita :)

Alex MAN
fonte