เฟรมเวิร์ก Node.js เพื่อเลียนแบบพฤติกรรมการท่องเว็บของมนุษย์บน Chrome
HOSIT เป็นเฟรมเวิร์ก Node.js ซึ่งขยายตัวหุ่นเชิดโครเมี่ยม API แบบไม่มีหัวด้วยฟังก์ชั่นเพิ่มเติมทำให้พฤติกรรมการท่องเว็บอินเทอร์เน็ตอัตโนมัติเป็นมนุษย์มากที่สุดเท่าที่จะทำได้
เราพัฒนากรอบนี้สำหรับการศึกษาเกี่ยวกับบริการออนไลน์ซึ่งต้องการให้เบราว์เซอร์อัตโนมัติของเราเป็นมนุษย์มากที่สุดเท่าที่จะทำได้ ในงานของเรานี่คือคุณจริงเหรอ? การศึกษาเชิงประจักษ์เกี่ยวกับการตรวจสอบความถูกต้องตามความเสี่ยงที่ใช้ใน WILD เราใช้ Hosit เพื่อหาข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติด้านการตรวจสอบความเสี่ยงของบริการออนไลน์ขนาดใหญ่ (ซึ่งเป็นความลับของ บริษัท )
รายละเอียดเพิ่มเติมเกี่ยวกับ hosit และวิธีที่คุณสามารถใช้สำหรับการศึกษาของคุณเองจะถูกนำเสนอในสิ่งพิมพ์ของเราแม้กระทั่งทัวริงบางครั้งก็ไม่สามารถบอกได้ว่า: การเลียนแบบพฤติกรรมการใช้งานมนุษย์สำหรับการศึกษาเชิงสำรวจของบริการออนไลน์
เราบันทึกวิดีโอนี้เมื่อวันที่ 17 พฤษภาคม 2019 ดังนั้นข้อความค้นหาที่สร้างขึ้นสะท้อนให้เห็นถึงเหตุการณ์ปัจจุบันที่ครอบคลุมในสื่อเยอรมันที่นี่ (คำค้นหาถูกสร้างขึ้นโดย Hosit โดยอัตโนมัติ)
Puppeteer 0.13.0 | ทำให้มีรอยย่น |
---|---|
ความเร็วในการพิมพ์คงที่ด้วยแต่ละคีย์ | การพิมพ์แบบสุ่ม ซึ่งแตกต่างกันไปตามแต่ละคีย์รอบการเบี่ยงเบนที่กำหนดไว้ |
คลิกภายในศูนย์กลางที่แน่นอนขององค์ประกอบ | คลิกประมาณ 1/4 ของศูนย์กลางขององค์ประกอบด้วย การเบี่ยงเบนแบบสุ่ม |
0 ms ล่าช้าระหว่างการกดและปล่อยปุ่มเมาส์ | ความล่าช้าแบบสุ่ม ระหว่างการกดและปล่อยปุ่มเมาส์ |
ไม่มีการเลื่อน | ฟังก์ชั่นการเลื่อน ด้วยการจำลองการอ่านรวม |
ไม่มีการสร้างข้อความค้นหา | เครื่องกำเนิดข้อความค้นหา ที่ขยายได้ |
ไม่มีฟังก์ชั่นในการเลือกแท็บหรือเฟรม | การเลือกแท็บ/เฟรม ที่มี URL ที่แน่นอน |
ไม่มีการบันทึก | ฟังก์ชัน การบันทึกเพิ่มเติม (เช่นถ่ายภาพหน้าจอบันทึกเหตุการณ์ทั้งหมดลงในฐานข้อมูล) |
ไม่มีการแก้ Captcha | การแก้ปัญหาอัตโนมัติของ (อีกครั้ง) CAPTCHAS (จำเป็นต้องใช้คีย์ API API API) |
เวิร์กโฟลว์ที่ใช้กันทั่วไปใช้รหัสมากโดยเฉพาะอย่างยิ่งเมื่อจำลองอัตลักษณ์ของมนุษย์ | คลาสคอนโทรลเลอร์ ซึ่งจำลองพฤติกรรมของตัวตนของผู้ใช้และง่ายขึ้นแอปพลิเคชันของเวิร์กโฟลว์หุ่นเชิดที่ใช้กันทั่วไป (เช่นการเริ่มต้นเบราว์เซอร์, แท็บเปิด/ปิด, การพิมพ์/คลิก, ถ่ายภาพหน้าจอ) |
ด้วย NPM:
npm install hosit-browser
ด้วยเส้นด้าย:
yarn install hosit-browser
หมายเหตุ : อย่างน้อย node.js v7.6.0 เป็นสิ่งจำเป็นเนื่องจากเฟรมเวิร์กนี้ขึ้นอยู่กับคำสั่ง await
ข้อกำหนดทั้งหมดที่จำเป็นในการใช้ Puppeteer ยังใช้สำหรับกรอบนี้
เอกสารมีอยู่ที่ docs/api.md
นอกจากนี้คุณยังสามารถสร้างเอกสารด้วยตัวเองด้วย JSDOC:
jsdoc -c jsdoc-conf.json
รหัสจะต้องป้อนในสภาพแวดล้อม async:
( async ( ) => {
// Enter your code here
} ) ( ) ;
นำเข้าโมดูล:
// Import module
const HOSIT = require ( "hosit-browser" )
สร้างตัวตน
const testidentity = new HOSIT . Identity ( "Firstname" , "Lastname" , new Date ( 1992 , 5 , 19 ) ,
"[email protected]" , "PASSW0RD" , "Company" , "Position" , 456 , 265 ,
global . GENDER_MALE ) ;
เริ่มต้นคอนโทรลเลอร์และกำหนดให้กับตัวตนที่สร้างขึ้น
// Initiate controller with test identity
const controller = await new HOSIT . Controller ( testidentity ) ;
// Start browser session and open new tab
await controller . init ( ) ;
ตอนนี้คุณสามารถควบคุมตัวตนของคุณด้วยวัตถุ contoller เช่น:
// 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 ( ) ;
สคริปต์ทดสอบอยู่ที่ตัวอย่าง/ตัวอย่าง. js
อย่าลืมใช้รอ await
ในกรณีส่วนใหญ่เนื่องจากฟังก์ชั่นอะซิงโครนัสที่จัดทำโดย Puppeteer API
เพื่อที่จะเลียนแบบพฤติกรรมการท่องเว็บของมนุษย์ว่าเป็นมนุษย์มากที่สุดเท่าที่จะเป็นไปได้เบราว์เซอร์จะเริ่มต้นในโหมดการแสดงผล (GUI) เราค้นพบว่ามีการตรวจพบโหมด chromium headless และบล็อกบางส่วนโดยบริการออนไลน์ขนาดใหญ่ซึ่งไม่ใช่กรณีของโหมด GUI ที่ควบคุมระยะไกล
โหมด GUI สามารถเริ่มต้นได้อย่างไร้จุดหมายบนเซิร์ฟเวอร์ Linux โดยเริ่มต้นในโหมด "หัวเรื่อง" ด้วย X Virtual Framebuffer (XVFB)
ติดตั้ง (เช่น Ubuntu):
# apt-get install xvfb
เปิดตัวด้วยความละเอียด 1366x768 พิกเซล:
$ xvfb-run --server-args= " -screen 0 1366x768x24 " ./[path to your NodeJS script].js
วิธีการตรวจจับโครเมี่ยมที่เป็นที่รู้จักกันทั่วไปส่วนใหญ่ (ณ เดือนมิถุนายน 2018) สามารถกำจัดได้ด้วยโหมด "หัวเรื่อง" ในรุ่นที่ไม่มีการแก้ไขของ Chrome/Chromium อย่างไรก็ตามเราขอแนะนำให้สร้างเวอร์ชันโครเมียมของคุณเองด้วยการปรับเพิ่มเติม (เช่นแก้ไขหรือลบวัตถุ navigator.webdriver
) เพื่อลดการตรวจจับได้มากยิ่งขึ้น ดูผลงานของ Antoine Vastel สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการตรวจจับเบราว์เซอร์แบบไม่มีหัวโดยบริการ
การตั้งค่าเช่นสตริงตัวแทนผู้ใช้ของเบราว์เซอร์และขนาดหน้าต่างสามารถปรับได้โดยการเปลี่ยนพารามิเตอร์การตั้งค่าภายในโมดูล HOSIT ที่นำเข้า
จากตัวอย่างด้านบนเราสามารถตรวจสอบการเปลี่ยนตัวแทนผู้ใช้เป็น Firefox 58.0 ด้วย:
HOSIT . Settings . USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0" ;
โปรดทราบว่าจะต้องตั้งค่าการตั้งค่าบางอย่างก่อนคำสั่ง Controller.init
เพื่อให้สามารถใช้งานได้ การตั้งค่าที่เป็นไปได้ทั้งหมดที่มีค่าเริ่มต้นสามารถเห็นได้ภายในรวมถึง/settings.js
คีย์ ANTI-CAPTCHA API ที่จำเป็นสำหรับการแก้ CAPTCHA สามารถเพิ่มได้เช่นกัน
คุณสามารถปรับปรุงรายการเครื่องกำเนิดข้อความค้นหาด้วยเครื่องกำเนิดฟีด RSS ของคุณเอง สิ่งนี้อาจมีประโยชน์หากคุณต้องการสร้างคำค้นหาสำหรับการค้นหาทางภูมิศาสตร์ที่แตกต่างกัน
ในตัวอย่างของเราเราใช้ฟีด RSS สำหรับ Google Hot Trends สำหรับตำแหน่งทางภูมิศาสตร์ของสหรัฐอเมริกา:
https://trends.google.com/trends/hottrends/atom/feed?pn=p1
กำหนดคุณสมบัติสำหรับรายการใหม่ (เช่นเดียวกับที่คุณเห็นใน Intive/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 ( ) ;
}
} ;
เพิ่มรายการใหม่ในรายการเครื่องกำเนิดข้อความค้นหาที่กำหนดไว้ในการตั้งค่า:
HOSIT . Settings . SEARCH_QUERY_GENERATORS . hottrends = trendsus ;
หากคุณต้องการใช้เครื่องกำเนิดคิวรีของคุณเป็นเครื่องกำเนิดไฟฟ้าเริ่มต้นเพียงเปลี่ยนวัตถุเริ่มต้นของรายการ:
HOSIT . Settings . SEARCH_QUERY_GENERATORS . default = trendsus ;
ตอนนี้เราสามารถโทรหาเครื่องกำเนิดข้อความค้นหาใหม่ของเราด้วยคำหลักที่เราใช้ hottrends
ในกรณีของเราตามตัวอย่างด้านบน:
await controller . typeSearchQuery ( "input[type='text']" , "hottrends" ) ;
หากคุณเปลี่ยนเครื่องกำเนิดไฟฟ้าเริ่มต้นคุณสามารถใช้การโทรฟังก์ชั่นที่สั้นกว่าได้เช่นกัน:
await controller . typeSearchQuery ( "input[type='text']" ) ;
สคริปต์ทดสอบที่มีตัวอย่างอยู่ที่ตัวอย่าง/ตัวอย่าง-นิวอรี่เจนเนอเรเตอร์
เฟรมเวิร์กสามารถขยายได้สำหรับการบันทึกฐานข้อมูล (แนะนำ MongoDB) ดูรายละเอียดโครงการ Hosit-Logger
เฟรมเวิร์กนี้ถูกใช้และทดสอบกับ Puppeteer 0.13.0 ระหว่างเดือนธันวาคม 2017 ถึงมีนาคม 2018 อย่างไรก็ตามเราคิดว่ามันทำงานร่วมกับเวอร์ชั่น Puppeteer รุ่นใหม่เช่นกัน
เราเชื่อมั่นว่าวิธีการตรวจจับแบบไม่มีหัวจะดีขึ้นเมื่อเวลาผ่านไป (ดู EG headless-cat-n-mouse บน GitHub) หลังจากตีพิมพ์เอกสารทางเทคนิคมีแนวโน้มว่าบริการออนไลน์จะพยายามป้องกัน Hosit ดังนั้นอย่าลังเลที่จะปรับปรุงกรอบนี้
เราให้รายละเอียดเพิ่มเติมเกี่ยวกับ Hosit ในสิ่งพิมพ์ต่อไปนี้ ที่นั่นคุณสามารถค้นหาข้อมูลเกี่ยวกับวิธีการใช้ HOSIT สำหรับการศึกษาวิจัยของคุณเอง โปรดอ้างอิงกระดาษเมื่อใช้ hosit ในการศึกษาของคุณเอง:
แม้แต่ทัวริงบางครั้งก็ไม่สามารถบอกได้ว่า: การเลียนแบบพฤติกรรมการใช้งานมนุษย์สำหรับการศึกษาเชิงสำรวจของบริการออนไลน์ (2019)
Stephan Wiefling, Nils Gruschka และ Luigi Lo Iacono
การประชุม Nordic ครั้งที่ 24 เกี่ยวกับระบบไอทีที่ปลอดภัย (Nordsec 2019) , Aalborg, เดนมาร์ก
@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 }
}
นอกจากนี้เรายังได้ทำการศึกษาที่ครอบคลุมเกี่ยวกับการรับรองความถูกต้องตามความเสี่ยงโดยใช้เครื่องมือนี้:
นี่คือคุณจริงเหรอ? การศึกษาเชิงประจักษ์เกี่ยวกับการรับรองความถูกต้องตามความเสี่ยงที่ใช้ใน WILD (2019)
Stephan Wiefling, Luigi Lo Iacono และ Markus Dürmuth
34th IFIP TC-11 การประชุมนานาชาติเรื่องความปลอดภัยของข้อมูลและการคุ้มครองความเป็นส่วนตัว (IFIP SEC 2019) , Lisbon, 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 }
}
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT (ใบอนุญาต)