web-dev-qa-db-ja.com

Webサイトは、プライベートブラウジングモードを使用しているかどうかを検出できますか?

最新のブラウザのほとんどは「 プライベートブラウジングモード 」(Chromeは「シークレットモード」とも呼ばれます)をサポートしており、ブラウザはブラウジングに関する情報をディスクに保存しません。このモードの間。

最近のブラウザーでは、Webサイトにアクセスしているユーザーがプライベートブラウジングモードが有効になっているかどうかをWebサイトで検出できますか?

私が行った背景研究。これが、この質問に関連して私が見つけたものです。残念ながら、それは実際には上記の質問には答えません。

  • プライベートブラウジングモードの 2010年の調査 は、CSS履歴スニッフィング攻撃を使用することにより、Webサイトがブラウザーがプライベートブラウジングモードであるかどうかを検出できることを示しました。 (プライベートブラウジングモードでは、サイトは履歴に追加されないため、履歴スニッフィングを使用して、訪問者がプライベートブラウジングモードであるかどうかを確認できます。)それ以来、最近のブラウザーには defenses -が組み込まれています。 against CSS履歴スニッフィング攻撃。

    したがって、ブラウザがプライベートブラウジングモードにあるかどうかを検出する方法が成功することは期待できません。 (私は歴史の盗聴に対する防御は 完璧ではない であると理解していますが、これらの目的には十分かもしれません。)

  • ways にアクセスしているWebサイトについて learn が現在他のサイトにログインしているかどうかを確認できます(Facebookと考えてください)。ユーザーが現在他のサービス(Facebookなど)にログインしている場合、Webサイトはユーザーが現在プライベートブラウジングモードを使用していないと推測します-これは確かなことではありませんが、おそらく何らかの推論を行うことができます。ただし、ユーザーが他のサービスにログインしていない場合、私が言えることは、プライベートブラウジングモードが使用されているかどうかがわからないということだけです。これにより、情報の部分的な漏洩が発生する可能性はあると思いますが、それが機能する場合でも、せいぜい信頼できないように思えます。これがまったく機能しない可能性もあります。

では、誰かがWebサイトの訪問者がプライベートブラウジングモードを使用しているかどうかをテストする方法があるかどうかについて、より最近の情報を提供できますか?

64
D.W.

プライベートブラウジングを確実に検出できるかどうかはわかりませんが、いくつかのヒューリスティックを適用して、ユーザーが正しいことを推測できると思いますさまざまなプライバシー強化機能を使用します。質問に対する私のコメントで示したように、これが十分であるか、アプリケーションに適しているかは、プライベートブラウジングの検出に対応して何を実行できるかによって異なります。 Sonny Ordellが述べたように、プライベートブラウジングと、プライバシーを強化するさまざまな機能(履歴やCookieを手動で消去するなど)のアドホックな使用を区別できるかどうかもわかりません。

Webアプリケーションを操作していて、(アカウントを持つ)ユーザーの1人がプライベートブラウジングに切り替わったことを検出するとします。この戦略は行動データのさまざまなビットを追跡することに依存しているため、ユーザーがアカウントを持っていることを指定しています。プライベートブラウジングの側面は、(少なくとも Firefox の場合):履歴、フォーム/検索エントリ、パスワード、ダウンロード、Cookie、キャッシュ、DOMストレージです。ダウンロードをプローブする方法はわかりませんが、他のものはプローブできると思います。それらのすべてで肯定的な検出が得られた場合、ユーザーがプライベートブラウジングしている可能性が高くなります。

  • 些細なケースでは、各ユーザーの(IP, user-agent)を追跡します。一致する(IP, UA)レコードに対するCookieを使用しないリクエストを受け取った場合、対応するユーザーがプライベートブラウジングであると推測できます。次の場合、このメソッドは失敗します(検出されません)。

    1. 彼はProxySwitchyやTorButtonなどを使用して、プライベートブラウジング中にTorをアクティブにし、IPを変更します。
    2. 彼は別のブラウザーに切り替えます(たとえば、通常はFFを使用し、Chrome)に切り替えます)。
    3. プライベートブラウジングへの切り替えはすぐではなく、ISPは新しいIPを発行しました(たとえば、金曜日は10.1.2.3で、週末はアプリを使用せず、月曜日は10.1.4.5です)。

    Sonny Ordellの回答 で述べたように、他の人がプライベートブラウジングモードで同じブラウザを使用してサイトの別のアカウントにアクセスすると、検出されます-しかし、これは、 「通常の」ユーザーは、プライベートブラウジングモードに切り替えるだけです。

    ユーザーがサイトのCookieをクリアするか、セカンダリプロファイルを使用すると、誤検知が発生します(たとえば、特定のテストや追跡を回避するために、プラグインの異なるセットでいくつかの異なるFirefoxプロファイルを保持しますが、追跡を回避します)。これは非常に珍しいことだと思います)。

  • より複雑なチェックとして、 EFFのpanopticlick のようなものを使用して、各ユーザーのUAだけでなく、ブラウザーのフィンガープリント(またはフィンガープリントのコレクション)を維持できます。これは、上記の状況2で失敗します(たとえば、ユーザーが識別可能なブラウジングにFFを排他的に使用し、Chrome)を使用している場合)。ユーザーがJavaScriptが無効になっています。ユーザーが異なるセッションでJavaScriptを選択的に有効にすると(例:一時的に許可されたサイトでのNoScript)、指紋はchangeになります。

  • Tor出口ノードを介したアクセスを検出し、これをフィンガープリントと組み合わせることで、問題1(Tor)を打破できる可能性があります。これは、狭い範囲の場合にのみ役立つようです。

  • 上記のチェックのための単なるCookieの代わりに、localStorageをテストします。通常は有効になっていて、キーがこの訪問のストレージになく、指紋が一致する場合、これはおそらくプライベートブラウジングです。明らかに、ユーザーが通常ストレージを無効にしている場合、それを使用することはできません。障害モードは、Cookieについて上記で説明したものと同様です。

  • まだテストや開発はしていませんが、Cache-Controlでゲームをプレイできると思います。 (迅速な search が明らかに これは元のアイデアではないこと -そのプロジェクトには概念実証コードのようなものがあります。)この戦略は、ユーザーが共有キャッシングプロキシを介して-その間、ページはanonymizer.comについて言及しています。 Firefoxは、少なくとも、プライベートブラウジングモードではキャッシュを使用しません。 (キャッシュベースの追跡のデモについては このサイト を参照してください。)したがって、これを上記のUA /フィンガープリントと組み合わせることができます。キャッシュトラッカーがこれが最初の訪問であることを示している場合、次のように推測できます。ユーザーはプライベートブラウジングです。これは、ユーザーがキャッシュをクリーンアップすると誤検知で失敗します。より正確な推測を得るために他の手法と組み合わせる。

  • ブラウザーが特定のフォーム要素を自動入力するかどうかを、ユーザーごとに検出して追跡できます。特定のユーザーがそのフォーム要素で自動入力を取得していないことを検出した場合、プライベートブラウジングを推測している可能性があります。これは脆弱です。おそらくユーザーは「プライマリ」コンピュータを使用していませんが、前述のようにフィンガープリントと組み合わせて、より信頼できる推測を行うことができます。

  • サイドチャネルタイミング攻撃:各ユーザーがアプリにログインするのにかかる一般的な時間を検出して追跡します。バリエーションはありますが、誰かがパスワードの自動入力を使用しているかどうかを正確に推測できると思います。ユーザーが通常パス​​ワードオートフィルを使用している場合(ログインページを介した高速移行)、特定の訪問(一致する指紋を使用)でオートフィルを使用していない場合は、プライベートブラウジングを推測できます。これもまたもろいです。より正確な推測のために他の手法と組み合わせる。また、特定のページ読み込み時のネットワーク遅延を検出して修正することもできます(たとえば、ユーザーのネットワークが特定の日に遅いだけであり、ログインページの遷移が遅いのは、待ち時間であり、自動入力の欠落ではありません)。少し邪魔になってユーザーを自動ログアウト(ユーザーに偽のエラーメッセージを表示し、「もう一度お試しください」)して、ユーザーを少し困らせても2番目のデータポイントを取得できます。

  • これを、ユーザーが他のサービス(Facebookなど)にログインしているかどうかを検出することについての質問で述べた内容と組み合わせると、推測の信頼性が高まります。

  • 本当にやる気があるなら、DNSでゲームをプレイし、ページの読み込み時間を追跡することができます。 FF 3.6とChrome 15の簡単なテストは、どちらのブラウザーもプライベートブラウジングモードでDNSキャッシュをクリアしないことを示しているようです。また、ブラウザーはローカルシステムのDNSキャッシュを完全に制御できません。フィンガープリントの代わりに(またはそれに加えて)ユーザートラッキングを実行するサイドチャネルDNSタイミング攻撃では、推測の信頼性が高まる可能性があります。DNSタイミングによるトラッキングがどの程度信頼できるかはわかりません。

プライベートブラウジングモードでの「匿名」ユーザーの検出は、「典型的な」動作に関するデータを蓄積する機会がなかったため、はるかに困難になります。また、ほとんどの機能はブラウザセッションを終了したときにのみ機能するため、機能が戻ってくるかどうかはわかりません。

そうは言っても、悪意のある意思があり、ユーザーがサイトに2回目のチャンスを与えることをいとわないことを知っているリソースがある場合、匿名ユーザーによるプライベートブラウジングを検出するためのアイデアを以下に示します。 javascriptを有効にするユーザー。指紋を追跡し、永続的なcookie、localStorage、キャッシュを設定します-ユーザーを追跡するためにできることは何でも。指紋によると、初めてのアクセスの場合は、JavaScript(またはフラッシュなど、悪意のあるトリック)でブラウザをクラッシュ/ハングアップさせます。大量のメモリを吸い込んだり、ループで立ち往生したり、ユーザーがブラウザを閉じたりするために必要なものをすべて吸い取ります。その後、彼らが戻ってくると、(指紋から)2回目の訪問であることがわかります。 cookie/storage/cache/etcが設定されていない場合は、最初のセッションがプライベートブラウジングであったと推測できます。また、2番目のセッションもおそらくプライベートブラウジングであると推測している可能性があります。これは、ユーザーが戻ってこない場合、またはクラッシュしたり、ブラウザーウィンドウを強制終了したりできない場合は、明らかに失敗します。おまけとして、カスタムURLに送信し、非プライベートモードでブラウジングセッションを復元した場合、URLをブックマークしていない限り、プライベートブラウジングモードではないと推測できます。

上記のすべては穴でいっぱいです-偽陽性または陰性のための十分な余地。プライベートブラウジングを使用しているかどうか、またはVMでブラウザーを実行しているかどうかは、おそらくわかりません。違いは何ですか?)

最悪の部分はおそらく、あなたがdoプライベートブラウジングを検出するための信頼できる方法で回答を得ると、ブラウザーはそれを「修正」するか、ユーザーが検出を回避するための回避策を見つけます。

30
bstpierre

HTML 5ローカルストレージチェックにより、プライベートブラウジングモードを確実に検出できるようになりました(2019)。 「ローカルストレージ」の書き込みと読み取りを試みることで機能します。

見る:

https://Gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1

または

https://github.com/jLynx/PrivateWindowCheck with PoC

  ------ edit to add functional description ----

上記のjheraxリンクから:

...
    // **Firefox**
    if ('MozAppearance' in document.documentElement.style) {
      if (indexedDB === null) return yes();
      const db = **indexedDB.open**('test');
      db.onerror = yes;
      db.onsuccess = not;
      return void 0;
---

上記のjLynxから

...
        } else if(navigator.userAgent.includes("Firefox")){
            //Firefox
            var db = indexedDB.open("test");
            db.onerror = function(){resolve(true);};
            db.onsuccess =function(){resolve(false);};
---

どちらの例でも、永続的なローカルストレージを開くことができない場合、Firefoxの indexDB (HTML 5で定義)はプライベートブラウジングを示します。他のブラウザは localStorage のような異なる名前でローカルストレージを呼び出します。

10
user10216038

ヒューリスティックを使用して、確実な推測を行うことができます。たとえばIE10とIE11(およびSafari、IIRC)では、ブラウザがInPrivateモードであることを示す強力なヒントとしてIndexedDBを使用しようとすると例外がスローされます。

同様に、必要な「ライセンスアーティファクト」をプライベートモードで作成することが許可されていないため、ブラウザーがInPrivate/Incognitoの場合、AdobeのDRMシステム(HBOGOによって使用されているようです)はエラーコードを表示します。 https://forums.Adobe.com/thread/1189199

8
EricLaw

あなたはより正確で最新の答えを求めているので、賞金があると思いますが、真実は正しい答えがすでに他の人から与えられているということです。私はJS開発者ではありませんが、これがどのように機能するのかは知りませんが、もう少し詳しく説明します。

簡単な答えは、JavaScriptを使用して、主に一部の機能が使用可能かどうかをチェックする何らかのヒューリスティックを実装します。

たとえば、_bostonglobe.com_を見てください。プライベートモードで記事をクリックすると、「プライベートモードになっています」などの通知が表示されます。 JavaScriptを無効にすると、その通知は表示されなくなります。つまり、JavaScriptで行われます。ニューヨークタイムズに行く場合も同様です。それは単なるJSです。しかし、彼らはどのようにそれを正確に行うのですか? _bostonglobe.com_について、ソースで_meter.js_という名前のJSファイルにコードを見つけました。そのコードでdetectPrivateModeを検索すると、使用する関数が表示されます。縮小されているので、読むのは大変です。ただし、ブラウザーの開発ツールでソースをきれいにすると、次のコードが得られます。

_detectPrivateMode: function (t) {
  var e;
  if (window.webkitRequestFileSystem) window.webkitRequestFileSystem(window.TEMPORARY, 1, function () {
    e = !1
  }, function (t) {
    console.log(t),
    e = !0
  });
   else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
    var i;
    try {
      i = window.indexedDB.open('test')
    } catch (t) {
      e = !0
    }
    void 0 === e && n(function () {
      return 'done' === i.readyState
    }, function (t) {
      t || (e = !i.result)
    })
  } else if (r(window.navigator.userAgent)) {
    e = !1;
    try {
      window.indexedDB || (e = !0)
    } catch (t) {
      e = !0
    }
  } else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
    if (window.safariIncognito) e = !0;
     else {
      try {
        window.openDatabase(null, null, null, null)
      } catch (t) {
        e = !0
      }
      try {
        window.localStorage.setItem('test', 1)
      } catch (t) {
        e = !0
      }
    }
    void 0 === e && (e = !1, window.localStorage.removeItem('test'))
  }
  n(function () {
    return void 0 !== e
  }, function (n) {
    t(e)
  })
}
_

たとえば、彼らが_window.webkitRequestFileSystem_を使用しようとしていること、Firefoxではwindow.indexedDB.open('test')、Safary _window.openDatabase_などを試していることがわかります。これらの関数はすべて、プライベートモード(シークレットモード)では動作が異なるという事実に依存しているようです。ほとんどのコードはローカルストレージに関連する関数を使用しているようで、通常のモードとは動作が異なります。いくつかのtry-catchブロックがあるため、それらの関数のほとんどは、おそらくプライベートモードでも使用できません。これらの機能のいずれかをグーグル検索すると(おそらく「プライベート」または「シークレット」を検索に追加することになります)、プライベートモードを検出するための可能な方法を説明する多くの結果が見つかり、最終的に、コードは次のようになります。私が引用したものと非常に似ています。 StackExchangeにはいくつかの質問があり、コードスニペットGitHubもあります。たとえば、StackExchangeに関するこの回答には興味深い情報がいくつかあります。 https://stackoverflow.com/a/4132218

ニューヨークタイムズで、記事をクリックしてHTMLソースを開き、webkitRequestFileSystemを検索すると、同様のコードが見つかります。

ご覧のように、コードと使用するヒューリスティックにはいくつかの違いがあるかもしれませんが、すべてのWebサイトは同じ小さな関数セットに依存することでプライベートモードを検出している可能性があります。

6
reed

プライベートブラウジングモードのときにWebサイトが検出できるいくつかの方法があるようです デスクトップSafariおよびモバイルSafariの場合

デスクトップサファリは、プライベートブラウジングモードではファビコンを要求しません。 その他の違い もあります。

Mobile Safariは、プライベートブラウジングモードではHTML5ローカルストレージをサポートしません。これは、Webサイトでも検出可能です。

3
D.W.

2020年3月の時点では、Firefoxがプライベートモードで実行されているときに IndexedDB が機能しないという事実に基づいて、Firefoxがプライベートモードで実行されているかどうかをサイトが検出できるようです。ユーザーがプライベートモードでサイトを閲覧するのをブロックしたり、強制的にログインさせたりする手法を使用していると思われる主流のメディアアウトレットがいくつかあります。

サンプルコードを含むGitHub Gist:
https://Gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1

上記のコードの作業デモ:
https://output.jsbin.com/tazuwif

詳細情報を含むBugzillaスレッド:
https://bugzilla.mozilla.org/show_bug.cgi?id=781982
https://bugzilla.mozilla.org/show_bug.cgi?id=150668

1
mti2935

簡単な答えはノーです。

履歴が保存されていないことを単に検出しても、プライベートブラウジングモードが使用されているわけではなく、単に履歴が保存されていないことを意味します。これは、どのブラウザーでも簡単に構成できます。

別のサービスにログインしているのに、プライベートブラウジングモードを使用していないのはなぜですか?他の人のコンピューターでは、プライベートブラウジングモードでFacebookをよく使用します。これは、ログアウトする必要がなく、自分の状態を失うことなく自分のセッションを作成する簡単な方法だからです。

プライベートブラウジングモードでは、通常モードで設定できる機能が有効になります。便宜上、一時的に複数の機能を同時に有効にします。誰かがプライベートブラウジングモードを使用しているかどうか、または単にそれらの機能が有効にされているかどうかを知る方法はありません。

0
Sonny Ordell