Un marco node.js para imitar el comportamiento de navegación de Internet humano en Chrome
Hosit es un marco nodo.js que extiende el titiritero de la API Chrome sin cabeza con funcionalidades adicionales que hacen que el comportamiento de navegación de Internet automatizado sea lo más humano posible.
Desarrollamos este marco para estudios sobre servicios en línea que requirieron que nuestra automatización del navegador fuera lo más humana posible. En nuestro trabajo, ¿eres realmente tú? Un estudio empírico sobre la autenticación basada en el riesgo aplicada en la naturaleza, utilizamos Hosit para obtener más información sobre las prácticas de autenticación basadas en el riesgo de grandes servicios en línea (que las empresas mantuvieron en secreto).
Los detalles más sobre Hosit y cómo puede usarlo para sus propios estudios se presentan en nuestra publicación, incluso Turing, a veces no deberían saber: imitar el comportamiento de uso humanoide para los estudios exploratorios de los servicios en línea.

Grabamos este video el 17 de mayo de 2019, por lo que la consulta de búsqueda generada refleja un evento actual cubierto en los medios alemanes aquí (Hosit generó automáticamente la consulta de búsqueda).
| Titiritero 0.13.0 | Frasco |
|---|---|
| Velocidad de tipeo constante con cada llave | Tipeo aleatorizado que varía con cada clave alrededor de una desviación definida |
| Hace clic dentro del centro exacto del elemento | Clics alrededor de 1/4 del centro del elemento con desviación aleatoria |
| 0 ms retraso entre presionar y liberar el botón del mouse | Retraso aleatorio entre presionar y liberar el botón del mouse |
| Sin desplazamiento | Función de desplazamiento con simulación de lectura incluida |
| No hay generación de consultas de búsqueda | Generador de consultas de búsqueda extensible |
| No hay función para seleccionar pestañas o marcos | Selección de pestañas/marcos que contienen una determinada URL. |
| Sin registro | Funcionalidades de registro extendidas (por ejemplo, tomar capturas de pantalla, registrar todos los eventos en una base de datos) |
| No hay resolución de captcha | Resolución automatizada de (re) Captchas (requerido la tecla API anti-CAPTCHA) |
| Los flujos de trabajo de uso común toman mucho código, especialmente al simular identidades de forma humana. | Clase de controlador que simula el comportamiento de una identidad de usuario y facilita la aplicación de flujos de trabajo de titiriteros de uso común (por ejemplo, inicializando el navegador, pestañas de apertura/cierre, mecanografía/clic, tomando capturas de pantalla). |
Con npm:
npm install hosit-browser
Con hilo:
yarn install hosit-browser
Nota : Se necesita al menos Node.js V7.6.0 ya que este marco se basa en el comando await . Todos los requisitos necesarios para usar titiriteros también solicitan este marco.
La documentación está disponible en Docs/API.MD
También puede generar la documentación por su cuenta con JSDOC:
jsdoc -c jsdoc-conf.json
El código debe ingresarse en un entorno de asíncrono:
( async ( ) => {
// Enter your code here
} ) ( ) ;Módulo de importación:
// Import module
const HOSIT = require ( "hosit-browser" )Crear una identidad
const testidentity = new HOSIT . Identity ( "Firstname" , "Lastname" , new Date ( 1992 , 5 , 19 ) ,
"[email protected]" , "PASSW0RD" , "Company" , "Position" , 456 , 265 ,
global . GENDER_MALE ) ;Inicie el controlador y asignarlo a la identidad creada.
// Initiate controller with test identity
const controller = await new HOSIT . Controller ( testidentity ) ;
// Start browser session and open new tab
await controller . init ( ) ;Ahora puede controlar su identidad con el objeto del contador, por ejemplo:
// 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 ( ) ;El script de prueba se encuentra en ejemplos/ejemplo.js.
await usar en la mayoría de los casos debido a las funciones asincrónicas proporcionadas por la API de Puppeteer.
Para imitar el comportamiento de navegación humana de la manera más humana posible, el navegador se inicia en el modo de pantalla (GUI). Descubrimos que el modo sin cabeza de Chromium fue detectado y parcialmente bloqueado por grandes servicios en línea, que no fue el caso con el modo GUI controlado por control remoto.
El modo GUI se puede iniciar sin cabeza en un servidor de Linux al comenzarlo en un modo "Headful" con el X virtual FrameBuffer (XVFB).
Instalar (por ejemplo, Ubuntu):
# apt-get install xvfbLanzamiento con 1366x768 Píxeles Resolución:
$ xvfb-run --server-args= " -screen 0 1366x768x24 " ./[path to your NodeJS script].js La mayoría de los métodos comunes de detección de cromo sin cabeza conocidos (en junio de 2018) ya se pueden eliminar con el modo "confidencial" en versiones no modificadas de Chrome/Chromium. Sin embargo, recomendamos construir su propia versión de cromo con ajustes adicionales (por ejemplo, modificar o eliminar navigator.webdriver Object) para reducir aún más la detectabilidad. Vea las obras de Antoine Vastel para obtener más detalles sobre cómo los servicios pueden detectar los navegadores sin cabeza.
Configuración como la cadena de agente de usuario del navegador y el tamaño de la ventana se pueden ajustar cambiando los parámetros de configuración dentro del módulo Hosit importado.
Siguiendo el ejemplo anterior, podríamos cambiar el agente de usuario a Firefox 58.0 con:
HOSIT . Settings . USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0" ; Tenga en cuenta que algunas configuraciones deben establecerse antes del comando Controller.init para estar activo. Todas las configuraciones posibles con sus valores predeterminados se pueden ver dentro de incluir/settings.js.
La clave de la API anti-CAPTCHA necesaria para la resolución de captcha también se puede agregar allí.
Puede mejorar la lista de generadores de consultas de búsqueda con sus propios generadores RSS Feeds. Esto podría ser útil si desea generar consultas de búsqueda para diferentes geolocaciones.
En nuestro ejemplo, tomamos el feed RSS para las tendencias de Google Hot para la geolocalización de los Estados Unidos:
https://trends.google.com/trends/hottrends/atom/feed?pn=p1
Definir propiedades para la nueva entrada (al igual que se ve en incluir/settings.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 ( ) ;
}
} ;Agregue una nueva entrada a la lista de generadores de consultas de búsqueda definidos en la configuración:
HOSIT . Settings . SEARCH_QUERY_GENERATORS . hottrends = trendsus ;Si desea usar su generador de consultas como generador predeterminado, simplemente cambie el objeto predeterminado de la lista:
HOSIT . Settings . SEARCH_QUERY_GENERATORS . default = trendsus ; Ahora podemos llamar a nuestro nuevo generador de consultas de búsqueda con la palabra clave que utilizamos hottrends en nuestro caso siguiendo el ejemplo anterior:
await controller . typeSearchQuery ( "input[type='text']" , "hottrends" ) ;Si ha cambiado el generador predeterminado, también puede usar la llamada de función más corta:
await controller . typeSearchQuery ( "input[type='text']" ) ;El script de prueba con el ejemplo se encuentra en ejemplos/ejemplo-new-queryGenerator.js
El marco se puede extender para el registro de la base de datos (recomendado MongoDB). Consulte el proyecto Hosit-Logger para más detalles.
Este marco fue utilizado y probado con Puppeteer 0.13.0 entre diciembre de 2017 y marzo de 2018. Sin embargo, suponemos que también funciona con versiones más nuevas de Puppeteer.
Estamos convencidos de que los métodos de detección sin cabeza mejorarán con el tiempo (ver por ejemplo, Cat-N-Mouse en Github). Después de la publicación del documento técnico, es muy probable que los servicios en línea intenten proteger contra Hosit. Así que siéntase libre de mejorar este marco.
Proporcionamos más detalles sobre Hosit en la siguiente publicación. Allí también puede encontrar información sobre cómo usar Hosit para sus propios estudios de investigación. Cite el documento cuando use Hosit en sus propios estudios:
Incluso Turing a veces no debería poder saber: imitar el comportamiento de uso humanoide para los estudios exploratorios de los servicios en línea (2019)
Stephan Wiefling, Nils Gruschka y Luigi Lo Iacono .
24ª Conferencia Nórdica sobre Sistemas de TI Secure (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 }
}También hicimos un estudio exhaustivo sobre la autenticación basada en el riesgo utilizando esta herramienta:
¿Eres realmente tú? Un estudio empírico sobre la autenticación basada en el riesgo aplicada en The Wild (2019)
Stephan Wiefling, Luigi Lo Iacono y Markus Dürmuth .
34a Conferencia Internacional IFIP TC-11 sobre seguridad de la información y protección de la privacidad (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 proyecto tiene licencia bajo la licencia del MIT (licencia).