Chromeで人間のインターネット閲覧動作を模倣するnode.jsフレームワーク
Hositは、自動化されたインターネットブラウジングの動作を可能な限り人間のようにする追加機能を備えたヘッドレスChrome API Pupteerを拡張するNode.jsフレームワークです。
私たちは、ブラウザの自動化を可能な限り人間的にする必要があるオンラインサービスに関する研究のためのこのフレームワークを開発しました。私たちの仕事では、これは本当にあなたですか?野生で適用されるリスクベースの認証に関する実証的研究では、Hositを使用して、大規模なオンラインサービスのリスクベースの認証プラクティス(企業によって秘密にされていた)の詳細を調べました。
Hositの詳細と、あなた自身の研究のためにそれを使用する方法は、私たちの出版物で提示されています。
このビデオを2019年5月17日に録画したため、生成された検索クエリは、ここでドイツのメディアでカバーされている現在のイベントを反映しています(検索クエリはHositによって自動的に生成されました)。
Puppeteer 0.13.0 | hosit |
---|---|
各キーを使用した一定のタイピング速度 | 定義された偏差の周りの各キーによって変化するランダム化タイピング |
要素の正確な中心内をクリックします | 要素の中心の約1/4をランダムな偏差でクリックします |
マウスボタンを押すことと解放の間の0 ms遅延 | マウスボタンを押すことと解放の間のランダム化遅延 |
スクロールはありません | 読み取りシミュレーションを含むスクロール機能 |
検索クエリ生成なし | 拡張可能な検索クエリジェネレーター |
タブまたはフレームを選択する機能はありません | 特定のURLを含むタブ/フレームの選択。 |
ロギングはありません | 拡張ロギング機能(例:スクリーンショットの撮影、すべてのイベントをデータベースに記録する) |
キャプチャ解決はありません | (re)captchasの自動解決(アンチキャプチャAPIキーが必要) |
一般的に使用されるワークフローは、特に人間のようなアイデンティティをシミュレートする場合に多くのコードを取ります | ユーザーIDの動作をシミュレートし、一般的に使用されるPuppeteerワークフローの適用を容易にするコントローラークラス(例:ブラウザの初期化、開閉、タイピング/クリック、スクリーンショットの撮影)を容易にします。 |
NPMで:
npm install hosit-browser
糸で:
yarn install hosit-browser
注:このフレームワークはawait
コマンドに依存しているため、少なくともnode.js v7.6.0が必要です。 Pupteerを使用するために必要なすべての要件も、このフレームワークに適用されます。
ドキュメントは、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 ) ;
コントローラーを開始し、作成したIDに割り当てます。
// 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 ( ) ;
テストスクリプトは、例/example.jsにあります。
Pupteer APIによって提供される非同期関数のため、ほとんどの場合にawait
でいることを忘れないでください。
人間の閲覧行動を可能な限り人間のように模倣するために、ブラウザはディスプレイ(GUI)モードで開始されます。クロムヘッドレスモードが検出され、大きなオンラインサービスによって部分的にブロックされたことがわかりましたが、これはリモート制御GUIモードには当てはまりませんでした。
GUIモードは、X Virtual FrameBuffer(XVFB)を使用して「Headful」モードで起動することにより、Linuxサーバーで主に開始できます。
インストール(例:ubuntu):
# apt-get install xvfb
1366x768ピクセルの解像度で起動:
$ xvfb-run --server-args= " -screen 0 1366x768x24 " ./[path to your NodeJS script].js
一般的な既知のヘッドレスクロム検出方法(2018年6月)のほとんどは、Chrome/Chromiumの未修飾バージョンの「Headful」モードで既に排除できます。ただし、検出可能性をさらに低下させるために、追加の調整(たとえばnavigator.webdriver
オブジェクトを変更または削除するなど)を使用して独自のChromiumバージョンを構築することをお勧めします。サービスによってヘッドレスブラウザーがどのように検出されるかの詳細については、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
コマンドの前にいくつかの設定を設定する必要があることに注意してください。デフォルト値を持つすべての可能な設定は、include/settings.js内で見ることができます。
キャプチャ解決に必要なアンチキャプチャAPIキーもそこに追加できます。
独自のRSSフィードジェネレーターを使用して、検索クエリジェネレーターのリストを強化できます。これは、さまざまな地球定着の検索クエリを生成する場合に役立つ場合があります。
この例では、米国のジオロケーションのGoogleホットトレンドのRSSフィードを取得します。
https://trends.google.com/trends/hottrends/atom/feed?pn=p1
新しいエントリのプロパティを定義します(include/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']" ) ;
例を掲載したテストスクリプトは、Examples/Example-New-QueryGenerator.jsにあります
フレームワークは、データベースロギング用に拡張できます(MongoDB推奨)。詳細については、プロジェクトHosit-Loggerを参照してください。
このフレームワークは、2017年12月から2018年3月の間にPupteteer 0.13.0で使用され、テストされました。ただし、新しいPuppeteerバージョンでも機能すると仮定しています。
ヘッドレス検出方法は時間の経過とともに改善されると確信しています(GitHubのHeadless-Cat-N-Mouseなどを参照)。テクニカルペーパーの公開後、オンラインサービスがHositから保護しようとする可能性が非常に高いです。このフレームワークを自由に改善してください。
次の出版物で、Hositの詳細について説明します。また、あなた自身の調査研究にHositを使用する方法に関する情報を見つけることができます。あなた自身の研究でHositを使用するときに論文を引用してください:
チューリングでさえ、時々伝えることができないはずです:オンラインサービスの探索的研究のためのヒューマノイド使用行動の模倣(2019)
ステファン・ヴィーリング、ニルス・グルシュカ、ルイージ・ロ・イコノ。
デンマーク、アールボルグのセキュアITシステムに関する第24回ノルディック会議(Nordsec 2019) 。
@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ライセンス(ライセンス)に基づいてライセンスされています。