Uma estrutura Node.js para imitar o comportamento de navegação na Internet humano no Chrome
O Hosit é uma estrutura node.js que estende o boneco do Chrome API sem cabeça com funcionalidades adicionais, tornando o comportamento automatizado de navegação na Internet o mais humano possível.
Desenvolvemos essa estrutura para estudos sobre serviços on -line, que exigiam que nossa automação de navegador fosse o mais humano possível. Em nosso trabalho, é realmente você? Um estudo empírico sobre autenticação baseada em risco aplicada na natureza, usamos a Hosit para descobrir mais sobre as práticas de autenticação baseadas em risco de grandes serviços on-line (que foram mantidos em segredo pelas empresas).
Mais detalhes sobre o Hosit e como você pode usá -lo para seus próprios estudos são apresentados em nossa publicação, mesmo que o Turing às vezes não seja capaz de dizer: imitar o comportamento de uso humanóide para estudos exploratórios de serviços on -line.
Registramos este vídeo em 17 de maio de 2019, portanto a consulta de pesquisa gerada reflete um evento atual abordado na mídia alemã aqui (a consulta de pesquisa foi gerada automaticamente pelo Hosit).
Pupfeteer 0.13.0 | Hosit |
---|---|
Velocidade de digitação constante com cada chave | Digição randomizada que varia com cada chave em torno de um desvio definido |
Clique dentro do centro exato do elemento | Clique em torno de 1/4 do centro do elemento com desvio aleatório |
0 ms de atraso entre pressionar e liberar o botão do mouse | Atraso randomizado entre pressionar e liberar o botão do mouse |
Sem rolagem | Função de rolagem com simulação de leitura incluída |
Nenhuma geração de consulta de pesquisa | Gerador de consulta de pesquisa extensível |
Nenhuma função para selecionar guias ou quadros | Selecionando guias/quadros contendo um determinado URL. |
Sem log | Funcionalidades de log estendidas (por exemplo, tirando capturas de tela, registrando todos os eventos em um banco de dados) |
Nenhuma solução de captcha | Resolução automatizada de (re) captchas (chave da API anti-capitcha necessária) |
Os fluxos de trabalho comumente usados tomam muito código, especialmente ao simular identidades humanas semelhantes | A classe controladora que simula o comportamento de uma identidade do usuário e facilita a aplicação de fluxos de trabalho de marionetes comumente usados (por exemplo, inicialização do navegador, abas de abertura/fechamento, digitando/clicando, tirando capturas de tela). |
Com npm:
npm install hosit-browser
Com fios:
yarn install hosit-browser
NOTA : Pelo menos node.js v7.6.0 é necessário, pois essa estrutura se baseia no comando await
. Todos os requisitos necessários para usar marionetistas também se aplicam a essa estrutura.
A documentação está disponível em docs/api.md
Você também pode gerar a documentação por conta própria com o JSDOC:
jsdoc -c jsdoc-conf.json
O código deve ser inserido em um ambiente assíncrono:
( async ( ) => {
// Enter your code here
} ) ( ) ;
Módulo de importação:
// Import module
const HOSIT = require ( "hosit-browser" )
Criar uma identidade
const testidentity = new HOSIT . Identity ( "Firstname" , "Lastname" , new Date ( 1992 , 5 , 19 ) ,
"[email protected]" , "PASSW0RD" , "Company" , "Position" , 456 , 265 ,
global . GENDER_MALE ) ;
Inicie o controlador e atribua -o à identidade criada.
// Initiate controller with test identity
const controller = await new HOSIT . Controller ( testidentity ) ;
// Start browser session and open new tab
await controller . init ( ) ;
Agora você pode controlar sua identidade com o objeto Contoller, por exemplo:
// Open example.com
await controller . goto ( "https://example.com" ) ;
// Wait until "More Information"-Link is visible
await controller . waitForSelector ( "a[href='http://www.iana.org/domains/example']" ) ;
// Wait a random time period with the standard values
await controller . randomWait ( ) ;
// Click on the "More Information"-Link
await controller . click ( "a[href='http://www.iana.org/domains/example']" ) ;
// Wait until the page is loaded
await controller . waitForNavigation ( ) ;
// Wait a random time period with the standard values
await controller . randomWait ( ) ;
// Open new page tab with example.net
await controller . newPage ( "http://ixquick.com" ) ;
// Wait around 5 seconds
await controller . randomWait ( 5000 ) ;
// Wait until the text field is loaded
await controller . waitForSelector ( "input[type='text']" ) ;
// Enter Stuff inside the text field
await controller . type ( "input[type='text']" , "Here is an example search query: " ) ;
await controller . typeSearchQuery ( "input[type='text']" ) ;
// Wait around 5 seconds
await controller . randomWait ( 5000 ) ;
// Close the new Page tab
await controller . closePage ( ) ;
// Wait around 5 seconds
await controller . randomWait ( 5000 ) ;
// Scroll to the bottom of the last opened page (Simulate reading)
await controller . scrollToBottom ( ) ;
O script de teste está localizado em exemplos/exemplo.js.
Lembre -se de usar await
na maioria dos casos devido às funções assíncronas fornecidas pela API de marionetistas.
Para imitar o comportamento de navegação humana o mais humano possível, o navegador é iniciado no modo de exibição (GUI). Descobrimos que o modo de cabeça do cromo foi detectado e parcialmente bloqueado por grandes serviços online, o que não era o caso do modo GUI controlado remoto.
O modo GUI pode ser iniciado sem cabeça em um servidor Linux, iniciando -o no modo "de cabeça para baixo" com o X Virtual Framebuffer (XVFB).
Instale (por exemplo, Ubuntu):
# apt-get install xvfb
Inicie com a resolução de 1366x768 pixels:
$ xvfb-run --server-args= " -screen 0 1366x768x24 " ./[path to your NodeJS script].js
A maioria dos métodos de detecção de cromo sem cabeça conhecidos (em junho de 2018) já pode ser eliminada com o modo "cabeça de cabeça" em versões não modificadas do Chrome/Chromium. No entanto, recomendamos criar sua própria versão de cromo com ajustes adicionais (por exemplo, modificar ou remover o objeto navigator.webdriver
) para reduzir ainda mais a detectabilidade. Veja os trabalhos de Antoine Vastel para obter mais detalhes sobre como os navegadores sem cabeça podem ser detectados por serviços.
Configurações como a sequência do agente do usuário do navegador e o tamanho da janela podem ser ajustadas alterando os parâmetros de configurações dentro do módulo Hosit importado.
Seguindo o exemplo acima, poderíamos alterar o exemplo do agente do usuário para o Firefox 58.0 com:
HOSIT . Settings . USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0" ;
Observe que algumas configurações devem ser definidas antes do comando Controller.init
para estar ativo. Todas as configurações possíveis com seus valores padrão podem ser vistos internos incluem/Settings.js.
A chave da API anti-capitcha necessária para a solução do captcha também pode ser adicionada lá.
Você pode aprimorar a lista de geradores de consulta de pesquisa com seus próprios geradores de feeds RSS. Isso pode ser útil se você deseja gerar consultas de pesquisa para diferentes geolocações.
Em nosso exemplo, levamos o feed RSS para as tendências do Google Hot para a geolocalização dos EUA:
https://trends.google.com/trends/hottrends/atom/feed?pn=p1
Defina propriedades para a nova entrada (assim como você vê em incluir/configurings.js):
let trendsus = {
rssFeedURL : 'https://trends.google.com/trends/hottrends/atom/feed?pn=p1' ,
cacheFileName : "trendsusQueries" , // Name of the cache file created in tmp-folder
queryArrayObject : global . TRENDSUS_QUERIES , // our Array object where we're saving the queries
evaluationFunction : function ( item ) { // Function which evaluates every feed item and generates the query for it
// Writes item title in upper case for fun
return item . title . toUpperCase ( ) ;
}
} ;
Adicione uma nova entrada à lista de geradores de consulta de pesquisa definidos nas configurações:
HOSIT . Settings . SEARCH_QUERY_GENERATORS . hottrends = trendsus ;
Se você deseja usar seu gerador de consulta como gerador padrão, basta alterar o objeto padrão da lista:
HOSIT . Settings . SEARCH_QUERY_GENERATORS . default = trendsus ;
Agora, podemos ligar para o nosso novo gerador de consulta de pesquisa com a palavra -chave que usamos hottrends
em nosso caso após o exemplo acima:
await controller . typeSearchQuery ( "input[type='text']" , "hottrends" ) ;
Se você mudou o gerador padrão, também pode usar a chamada de função mais curta:
await controller . typeSearchQuery ( "input[type='text']" ) ;
O script de teste com o exemplo está localizado em exemplos/exemplo-new-querygenerator.js
A estrutura pode ser estendida para o registro do banco de dados (recomendado pelo MongoDB). Veja o projeto Hosit-Logger para obter detalhes.
Essa estrutura foi usada e testada com o Puppeteer 0.13.0 entre dezembro de 2017 e março de 2018. No entanto, assumimos que ele também funciona com versões mais recentes de marionetistas.
Estamos convencidos de que os métodos de detecção sem cabeça melhorarão ao longo do tempo (ver por exemplo, o Mouse sem cabeça-n-gat-n no GitHub). Após a publicação do artigo técnico, é muito provável que os serviços on -line tentem proteger contra o Hosit. Portanto, fique à vontade para melhorar essa estrutura.
Fornecemos mais detalhes sobre o Hosit na publicação a seguir. Lá você também pode encontrar informações sobre como usar o Hosit para seus próprios estudos de pesquisa. Cite o artigo ao usar o Hosit em seus próprios estudos:
Até Turing às vezes não deve ser capaz de dizer: imitar o comportamento de uso humanóide para estudos exploratórios de serviços on -line (2019)
Stephan Wiefling, Nils Gruschka e Luigi Lo Iacono .
24ª Conferência Nórdica sobre Sistemas de TI Segura (Nordsec 2019) , Aalborg, Dinamarca.
@inproceedings { Wiefling_Even_2019 ,
author = { Wiefling, Stephan and Gruschka, Nils and Lo Iacono, Luigi } ,
title = { Even {Turing} {Should} {Sometimes} {Not} {Be} {Able} {To} {Tell}: {Mimicking} {Humanoid} {Usage} {Behavior} for {Exploratory} {Studies} of {Online} {Services} } ,
booktitle = { 24th {Nordic} {Conference} on {Secure} {IT} {Systems} ({NordSec} 2019) } ,
series = { {Lecture} {Notes} in {Computer} {Science} } ,
volume = { 11875 } ,
pages = { 188--203 } ,
isbn = { 978-3-030-35055-0 } ,
doi = { 10.1007/978-3-030-35055-0_12 } ,
publisher = { Springer Nature } ,
location = { Aalborg, Denmark } ,
month = nov,
year = { 2019 }
}
Também fizemos um estudo abrangente sobre autenticação baseada em risco usando esta ferramenta:
É realmente você? Um estudo empírico sobre autenticação baseada em risco aplicada em The Wild (2019)
Stephan Wiefling, Luigi Lo Iacono e Markus Dürmuth .
34ª Conferência Internacional do IFIP TC-11 sobre Segurança da Informação e Proteção à Privacidade (IFIP SEC 2019) , Lisboa, Portugal.
@inproceedings { Wiefling_Is_2019 ,
author = { Wiefling, Stephan and Lo Iacono, Luigi and D"{u}rmuth, Markus } ,
title = { Is {This} {Really} {You}? {An} {Empirical} {Study} on {Risk}-{Based} {Authentication} {Applied} in the {Wild} } ,
booktitle = { 34th {IFIP} {TC}-11 {International} {Conference} on {Information} {Security} and {Privacy} {Protection} ({IFIP} {SEC} 2019) } ,
series = { {IFIP} {Advances} in {Information} and {Communication} {Technology} } ,
volume = { 562 } ,
pages = { 134--148 } ,
isbn = { 978-3-030-22311-3 } ,
doi = { 10.1007/978-3-030-22312-0_10 } ,
publisher = { Springer International Publishing } ,
location = { Lisbon, Portugal } ,
month = jun,
year = { 2019 }
}
Este projeto está licenciado sob a licença do MIT (licença).