إطار عمل node.js لتقليد سلوك تصفح الإنترنت البشري على الكروم
Hosit هو إطار عمل Node.js الذي يمتد بدمى API Chrome بدون رأس مع وظائف إضافية مما يجعل سلوك تصفح الإنترنت الآلي على شكل إنساني قدر الإمكان.
قمنا بتطوير هذا الإطار للدراسات على الخدمات عبر الإنترنت التي تطلب أن تكون أتمتة المتصفح لدينا أن تكون إنسانية قدر الإمكان. في عملنا ، هل هذا حقا أنت؟ دراسة تجريبية حول المصادقة القائمة على المخاطر المطبقة في البرية ، استخدمنا Hosit لمعرفة المزيد عن ممارسات المصادقة القائمة على المخاطر للخدمات الكبيرة عبر الإنترنت (التي كانت سرية من قبل الشركات).
يتم تقديم مزيد من التفاصيل حول Hosit وكيف يمكنك استخدامها في دراساتك الخاصة في نشرنا حتى لا ينبغي أن يكون Turing في بعض الأحيان قادرًا على معرفة: محاكاة سلوك الاستخدام البشري للدراسات الاستكشافية للخدمات عبر الإنترنت.
سجلنا هذا الفيديو في 17 مايو 2019 ، وبالتالي يعكس استعلام البحث الذي تم إنشاؤه حدثًا حاليًا مغطى بالوسائط الألمانية هنا (تم إنشاء استعلام البحث تلقائيًا بواسطة Hosit).
Puppeteer 0.13.0 | هوست |
---|---|
سرعة الكتابة المستمرة مع كل مفتاح | الكتابة العشوائية التي تختلف مع كل مفتاح حول انحراف محدد |
النقرات داخل المركز الدقيق للعنصر | نقرات حول 1/4 من مركز العنصر بانحراف عشوائي |
0 مللي ثانية التأخير بين الضغط على زر الماوس وإطلاقه | تأخير عشوائي بين الضغط وإطلاق زر الماوس |
لا تمرير | وظيفة التمرير مع محاكاة القراءة المضمنة |
لا يوجد جيل للبحث عن البحث | مولد استعلام البحث القابل للتمديد |
لا توجد وظيفة لتحديد علامات التبويب أو الإطارات | تحديد علامات التبويب/الإطارات التي تحتوي على عنوان URL معين. |
لا قطع الأشجار | وظائف التسجيل الموسعة (مثل أخذ لقطات شاشة ، وتسجيل جميع الأحداث في قاعدة بيانات) |
لا captcha حل | الحل الآلي لـ (Re) Captchas (مفتاح API المضاد لـ Captcha مطلوب) |
تستغرق مهام سير العمل الشائعة الاستخدام الكثير من التعليمات البرمجية ، خاصة عند محاكاة الهويات البشرية | فئة وحدة التحكم التي تحاكي سلوك هوية المستخدم وتخفيف تطبيق مهام سير عمل العرائس شائعة الاستخدام (مثل تهيئة المتصفح ، وفتح/إغلاق علامات التبويب ، والكتابة/النقر ، وأخذ لقطات الشاشة). |
مع 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 ( ) => {
// 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 ( ) ;
يوجد نص اختبار في أمثلة/مثال.
تذكر أن تستخدم await
في معظم الحالات بسبب الوظائف غير المتزامنة التي توفرها API Puppeteer.
من أجل تقليد سلوك التصفح البشري كبشر قدر الإمكان ، يتم بدء المتصفح في وضع العرض (GUI). اكتشفنا أنه تم اكتشاف وضع Chromium Headless وحظره جزئيًا بواسطة الخدمات الكبيرة عبر الإنترنت ، وهو ما لم يكن الأمر كذلك مع وضع واجهة المستخدم الرسومية عن بُعد.
يمكن بدء وضع واجهة المستخدم الرسومية بلا رأس على خادم Linux عن طريق بدء تشغيله في وضع "رأس" مع إطار X Virtual FrameBuffer (XVFB).
تثبيت (على سبيل المثال أوبونتو):
# apt-get install xvfb
إطلاق بدقة 1366x768 بكسل:
$ xvfb-run --server-args= " -screen 0 1366x768x24 " ./[path to your NodeJS script].js
يمكن بالفعل القضاء على معظم طرق الكشف عن الكروم المعروفة الشائعة (في يونيو 2018) مع الوضع "الرئيسي" على الإصدارات غير المعدلة من الكروم/الكروم. ومع ذلك ، نوصي ببناء إصدار الكروم الخاص بك مع تعديلات إضافية (على سبيل المثال تعديل أو إزالة navigator.webdriver
كائن) لتقليل القابلية للاكتشاف أكثر. راجع أعمال أنطوان فاستيل لمزيد من التفاصيل حول كيفية اكتشاف المتصفحات بلا رأس من قبل الخدمات.
يمكن ضبط إعدادات مثل سلسلة عميل مستخدم Browser وحجم النافذة عن طريق تغيير معلمات الإعدادات داخل وحدة 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
حتى تكون نشطة. يمكن رؤية جميع الإعدادات الممكنة بقيمها الافتراضية في الداخل.
يمكن إضافة مفتاح API Anti-Captcha اللازم لحل Captcha أيضًا.
يمكنك تحسين قائمة مولدات استعلام البحث مع مولدات خلاصات RSS الخاصة بك. قد يكون هذا مفيدًا إذا كنت ترغب في إنشاء استفسارات البحث عن الجغرافيات المختلفة.
في مثالنا ، نأخذ موجز RSS لاتجاهات Google Hot من أجل تحديد الموقع الجغرافي في الولايات المتحدة:
https://trends.google.com/trends/hottrends/atom/feed؟pn=P1
تحديد خصائص الإدخال الجديد (تمامًا كما تراه في inswer/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']" ) ;
يوجد البرنامج النصي للاختبار مع المثال في أمثلة/مثال على querygenerator.js
يمكن تمديد الإطار لتسجيل قاعدة البيانات (الموصى بها MongoDB). راجع مشروع Hosit-Logger للحصول على التفاصيل.
تم استخدام هذا الإطار واختباره باستخدام Puppeteer 0.13.0 بين ديسمبر 2017 ومارس 2018. ومع ذلك ، نفترض أنه يعمل مع إصدارات العرائس الأحدث أيضًا.
نحن مقتنعون بأن أساليب الكشف بدون رأس سوف تتحسن مع مرور الوقت (انظر على سبيل المثال فأر قشرة مقطوعة الرأس على Github). بعد نشر الورقة الفنية ، من المحتمل جدًا أن تحاول الخدمات عبر الإنترنت الحماية من Hosit. لذلك لا تتردد في تحسين هذا الإطار.
نحن نقدم المزيد من التفاصيل حول Hosit في المنشور التالي. هناك يمكنك أيضًا العثور على معلومات حول كيفية استخدام Hosit لدراسات البحث الخاصة بك. يرجى الاستشهاد بالورقة عند استخدام Hosit في دراستك الخاصة:
حتى في بعض الأحيان لا ينبغي أن يكون Turing قادرًا على معرفة: محاكاة سلوك الاستخدام البشري للدراسات الاستكشافية للخدمات عبر الإنترنت (2019)
ستيفان ويفلينج ، نيلز جروشكا ، ولويجي لو إياكونو .
المؤتمر الرابع والعشرين من Nordic حول أنظمة تكنولوجيا المعلومات الآمنة (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 }
}
أجرينا أيضًا دراسة شاملة حول المصادقة القائمة على المخاطر باستخدام هذه الأداة:
هل هذا حقا أنت؟ دراسة تجريبية حول المصادقة القائمة على المخاطر المطبقة في البرية (2019)
ستيفان ويفلينج ، لويجي لو إياكونو ، وماركوس دورموث .
المؤتمر الدولي 34 IFIP TC-11 حول أمن المعلومات وحماية الخصوصية (IFIP SEC 2019) ، لشبونة ، البرتغال.
@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 (ترخيص).