web-dev-qa-db-ja.com

PhantomJSベースのスパムボットを確実に検出する

PhantomJS/CasperJSを一貫して検出する方法はありますか?私はそれで構築された悪意のあるスパムボットのスパッツを扱っており、特定の動作に基づいてそれらをほとんどブロックすることができましたが、CasperJSが使用されているかどうかを知るための確固たる方法があるかどうかを知りたいです。絶え間ない適応は少し面倒になります。

私はキャプチャを使用することを信じていません。それらはネガティブなユーザーエクスペリエンスであり、ReCaptchaは私のMediaWikiインストールでスパムをブロックするために働いたことがありません。私たちのサイトにはユーザー登録(匿名の掲示板)がないため、投稿ごとにキャプチャエントリを用意する必要があります。 1日に数千件の正当な投稿があり、Captchaはその数の急降下爆弾を目にします。

24
Terrakin

CAPTCHAについてのあなたの見解を大いに共有します。私自身の検出スクリプトについて、これまでに検出できたものを、同様の目標でリストします。それらはもっとたくさんあるので、それは部分的です ヘッドレスブラウザ

公開されたウィンドウプロパティを使用して、これらの特定のヘッドレスブラウザを検出/想定するのはかなり安全です。

window._phantom (or window.callPhantom) //phantomjs
window.__phantomas //PhantomJS-based web perf metrics + monitoring tool 
window.Buffer //nodejs
window.emit //couchjs
window.spawn  //rhino

上記は jslint doc とファントムjsでのテストから収集されています。

ブラウザ自動化ドライバー(BrowserStackまたはその他のWebキャプチャサービスでスナップショットに使用):

window.webdriver //Selenium
window.domAutomation (or window.domAutomationController) //chromium based automation driver

プロパティは常に公開されているわけではなく、そのようなボットを検出するための他のより堅牢な方法を検討しています。これは、完了したら本格的なスクリプトとしてリリースする予定です。しかし、それは主にあなたの質問に答えます。

これは、JS対応のヘッドレスブラウザをより広く検出するためのもう1つのかなり適切な方法です。

if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser }

仮想ビューポートのサイズがヘッドレスブラウザによって設定されている場合でも、プロパティは0 デフォルトであり、デフォルトのサイズを報告できないため、これはうまく機能するはずです。 ブラウザウィンドウそれは存在しません。特に、Phantom JS outerWithまたはouterHeightをサポートしていません

補遺:ただし、outer/innerDimensionsにはChrome/Blinkのバグがあります。 Chromium ページが非表示のタブに読み込まれたときにこれらのディメンションを報告しません 前のセッションから復元されたときなど。 Safariにはその問題はないようです。

更新:iOS Safari 8+には、outerWidthとouterHeightが0のバグがあり、SailfishWebビューにもバグがあることが判明しました。したがって、これはシグナルですが、これらのバグに注意せずに単独で使用することはできません。したがって、warning:何をしているのかを本当に理解していない限り、この生のスニペットを使用しないでください。

PS:ここにリストされていない他のヘッドレスブラウザのプロパティを知っている場合は、コメントで共有してください。

22
hexalys

window.callPhantomプロパティを確認することで、クライアント側でファントムを検出できます。クライアント側の最小限のスクリプトは次のとおりです。

var isPhantom = !!window.callPhantom;

これが 概念実証の要点 これが機能することです。

スパマーはpage.evaluateを使用してこのプロパティを削除しようとする可能性があり、それは誰が速いかによって異なります。検出を試みた後、検出結果に応じて、投稿フォームとCAPTCHAを使用してリロードするかどうかを決定します。

問題は、ユーザーを困らせる可能性のあるリダイレクトが発生することです。これは、クライアントのすべての検出手法で必要になります。 onResourceRequested で破壊および変更できます。

一般的に、これは可能ではないと思います。クライアントで検出して結果をサーバーに送信することしかできないからです。 CAPTCHAを1ページの読み込みのみの検出ステップと組み合わせて追加しても、phantomjs/casperjsを使用した場合と同じように簡単に削除できるため、実際には何も追加されません。ユーザーエージェントに基づく防御も、phantomjs/casperjsで簡単に変更できるため、意味がありません。

3
Artjom B.

確固たる方法はありません。PhantomJSとSeleniumは、ユーザーがブラウザソフトウェアを制御するのではなく、ブラウザソフトウェアを制御するために使用されるソフトウェアにすぎません。

特に、PhantomJS 1.xでは、使用されているWebKitのバージョンのバグを悪用するブラウザーをクラッシュさせるために使用できるJavaScriptがいくつかあると思います(Chrome 13と同等であるため、ごくわずかです。本物のユーザーが影響を受けるはずです)。 (これは数か月前にPhantomメーリングリストで言及されたことを覚えていますが、使用する正確なJSが記述されているかどうかはわかりません。)より一般的には、ユーザーエージェントのマッチングと機能検出の組み合わせを使用できます。例えば。ブラウザが「Chrome23」であると主張しているが、Chrome 23にある機能(およびChrome 13にはない機能)がない場合は、疑わしいと思います。

ユーザーとして、私もCAPTCHAが嫌いです。しかし、スパマーのコストが増加するという点で非常に効果的です。スパマーは、より多くのソフトウェアを作成するか、人間を雇ってそれらを読み取る必要があります。 (だからこそ、簡単なCAPTCHAで十分だと思います。ユーザーを困らせるのは、それが何を言っているのかわからず、認識できるものを取得するためにリロードを押し続ける必要があるユーザーです。)

1つのアプローチ(Googleが使用していると思います)は、CAPTCHAを条件付きで表示することです。例えば。ログインしているユーザーには表示されません。このセッションですでに1つの投稿を行ったユーザーには、再度表示されません。ホワイトリスト(以前の正当な投稿から作成された可能性がある)のIPアドレスのユーザーは表示されません。または、逆に、IP範囲のブラックリストからユーザーに表示するだけです。

申し訳ありませんが、これらのアプローチはどれも完璧ではありません。

3
Darren Cook