web-dev-qa-db-ja.com

スクリプトを使用してChromeがシークレットモードになっているかどうかを確認できますか?

Google Chromeがスクリプトを介してシークレットモードになっているかどうかを判断できますか?

編集:実際にはユーザースクリプト経由で可能ですが、答えはJavaScriptがウェブページで実行されていると仮定しています。ユーザースクリプトに関して here の質問を再質問しました。

105
RodeoClown

はい。 FileSystem APIはシークレットモードでは無効になっています。 https://jsfiddle.net/w49x9f1a/ を確認してください。シークレットモードを使用している場合と使用していない場合です。

サンプルコード:

    var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
    if (!fs) {
      console.log("check failed?");
    } else {
      fs(window.TEMPORARY,
         100,
         console.log.bind(console, "not in incognito mode"),
         console.log.bind(console, "incognito mode"));
    }
224
Alok

1つの方法は、一意のURLにアクセスし、そのURLへのリンクがCSSによってアクセスされたものとして扱われるかどうかを確認することです。

この例を「シークレットの検出」(デッドリンク)で見ることができます。

上記のシークレットを検出するリンクを置き換えるための同じ著者による研究論文

main.html iframeを追加し、

 <iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>

、およびいくつかのJavaScriptコード:

function checkResult() {
  var a = frames[0].document.getElementById('test');
  if (!a) return;

  var color;
  if (a.currentStyle) {
    color = a.currentStyle.color;
  } else {
    color = frames[0].getComputedStyle(a, '').color;
  }

  var visited = (color == 'rgb(51, 102, 160)' || color == '#3366a0');
  alert('mode is ' + (visited ? 'NOT Private' : 'Private'));
}

function setUniqueSource(frame) {
  frame.src = "test.html?" + Math.random();
  frame.onload = '';
}

その後、test.html iFrameにロードされる:

<style> 
   a:link { color: #336699; }
   a:visited { color: #3366A0; }
</style> 
<script> 
  setTimeout(function() {
    var a = document.createElement('a');
    a.href = location;
    a.id = 'test';
    document.body.appendChild(a);
    parent.checkResult();
  }, 100);
</script> 

注:ファイルシステムからこれを試してみると、Chrome「安全でないJavascript」について叫ぶことができます。ただし、Webサーバーからは機能します。

18
JHurrah

JavaScriptで、JHurrahの answer を参照できます。リンクを強調表示しないことを除いて、シークレットモードはすべて、閲覧履歴とCookieを保存しません。 Googleから ヘルプページ

  • シークレットモードで開いているウェブページやダウンロードしたファイルは、閲覧履歴やダウンロード履歴に記録されません。
  • 開いたすべてのシークレットウィンドウを閉じると、新しいCookieはすべて削除されます。

通常のブラウジングとシークレットの違いがわかるようにafterにアクセスすると、Webページにアクセスします。モード。

this one here のような多くのHTTPリクエストアナラ​​イザーの1つを使用して、ブラウザーがサーバーに送信するものを正確に確認できます。通常のセッションとシークレットモードのヘッダーを比較すると、違いはありません。

8
Igor Zevaka

拡張機能を開発している場合は、タブAPIを使用して、ウィンドウ/タブがシークレットモードかどうかを判断できます。

詳細については、 こちら をご覧ください。

Webページで作業しているだけの場合は簡単ではなく、そのように設計されています。ただし、シークレットモードではデータベース(window.database)を開こうとすると、シークレットモードではユーザーのマシンにデータのトレースが残らないため、すべての試行が失敗することに気付きました。

私はそれをテストしていませんが、localStorageへのすべての呼び出しも失敗すると思われます。

4
Kinlan

これは、Promiseを使用して非同期コードがフラグを設定するのを待機するため、後で同期的に使用できます。

let isIncognito = await new Promise((resolve, reject)=>{
    var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
    if (!fs) reject('Check incognito failed');
    else fs(window.TEMPORARY, 100, ()=>resolve(false), ()=>resolve(true));      
});

それから私たちはできる

if(isIncognito) alert('in incognito');
else alert('not in incognito');
3
aljgom

Chrome 74+では、これを 利用可能なファイルシステムのストレージスペースを推定する

if ('storage' in navigator && 'estimate' in navigator.storage) {
    const {usage, quota} = await navigator.storage.estimate();
    console.log(`Using ${usage} out of ${quota} bytes.`);

    if(quota < 120000000){
        console.log('Incognito')
    } else {
        console.log('Not Incognito')
    }   
} else {
    console.log('Can not detect')
}
3
Vinnie James

以下は、ES6構文で記述され、わずかにクリーンアップされた推奨回答です。

const isIncognito = () => new Promise((resolve, reject) => {
    const fs = window.RequestFileSystem || window.webkitRequestFileSystem;

    if (!fs) {
        reject('Cant determine whether browser is running in incognito mode!');
    }

    fs(window.TEMPORARY, 100, resolve.bind(null, false), resolve.bind(null, true));
});

// Usage
isIncognito()
    .then(console.log)
    .catch(console.error)
0
nikksan

Alok's Answer に基づくクイックコピー/貼り付け機能(注:これは非同期です)

function ifIncognito(incog,func){
    var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
    if (!fs)  console.log("checking incognito failed");
    else {
        if(incog) fs(window.TEMPORARY, 100, ()=>{}, func);
        else      fs(window.TEMPORARY, 100, func, ()=>{});
    }
} 

使用法:

ifIncognito(true,  ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
0
aljgom