スクリプトを使用してChromeがシークレットモードであるかどうかを判断できますか?


114

スクリプトを使用して、Google Chromeがシークレットモードであるかどうかを確認することはできますか?

編集: 私は実際にはユーザースクリプトを介して可能であることを意味しましたが、答えはJavaScriptがWebページで実行されていることを前提としています。ここで、ユーザースクリプトに関する質問を再確認しました。


28
incognitoあなたがそれを簡単に決定できればそれはそれほどではないでしょう:)
Aren

そして、ユーザーは拡張マニュアルのシークレットモードを許可する必要があることを覚えておく必要があります。デフォルトでは、すべてが真です。
Mohamed Mansour

@Mohamed:ユーザーが許可する必要があるのは私なので、問題にはなりません:)
RodeoClown


1
@PeteAlvinまたは、サイトがシークレットモードを検出して価値を損なう可能性があります。ボストングローブのサイトは、シークレットモードで記事を表示しないため、ユーザーは無料の記事の割り当てを回避できません。一般的に、私は自分のことをあまり知らないサイトを好む。
JohnC

回答:


232

はい。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"));
    }


19
これは最もハックっぽい方法で、一番上にあるはずです。クリーンでエレガント。
トムテマン

1
@ user2718671 jsfiddle.net/w49x9f1aは、Mac osx上の最新のChromeでも問題なく動作します。奇妙な...
Alok

1
Chromeで試してみました。動作しますが、ロジックは逆です。
Lucas Massuh 2017

9
これらのコミットのおかげで、これはすぐに
なくなるでしょう

7
クロームv 77.0.3865.90で失敗する
Gitesh Purbia

18

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

この例は、「シークレットモードの検出」(デッドリンク)で確認できます。

上記のDetecting Incognitoリンクを置き換える同じ著者による研究論文

では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サーバーからのサービスは機能します。


とてもクールです。シークレットモードでは、アクセスしたリンクが強調表示されないことに気づきませんでした。ただし、ユーザーはリンクをクリックする必要があります。
イゴールゼバカ

1
いいえ、iframeはリンクを「クリック」します。
kibibu

40
ほとんどのブラウザはJavaScriptを介して:visitedスタイル情報を公開しないため、これは実際には機能しません。CSSインターフェースは、リンクに未訪問の色があるかのように表示します。これは、少なくとも2010年以降、WebKitおよびGeckoブラウザーで行われているセキュリティ対策です。これは、ユーザーの履歴を保護するためです(たとえば、考えられるすべてのURLを試し、訪問したURLをサードパーティに送信することができます。この方法で、 URL内のトークンへのアクセスなど)。
Timo Tijhof、2012年

2
プライバシーの変化を説明する公式Mozillaの記事:visitedhacks.mozilla.org/2010/03/...
デニウソンSáマイア

18

Chrome 74以降では、利用可能なファイルシステムのストレージ容量を見積もることでこれを判断できます

jsfiddleを参照してください

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')
}

4
これが正しい答えです。受け入れられた回答をこれで更新するか、受け入れられた回答を変更する必要があります。それが当時の正しい解決策だったので、最初に受け入れられた答えを奪わないでください。
ランチャー

8

JavaScriptで、JHurrahの回答をご覧ください。リンクを強調表示しないことを除いて、すべてのシークレットモードは閲覧履歴とCookieを保存しません。グーグルヘルプページから:

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

通常のブラウジングとシークレットモードの違いは、ウェブページにアクセスした後に発生することがわかるので、このモードでは、ブラウザがサーバーと通信することはありません。

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


最近では、ユーザーがシークレットセーフとして明確にマークした拡張機能を除いて、すべての拡張機能が無効になっています。
Tiberiu-Ionuțスタン

4

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

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

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

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


3

これは、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');

このルックス非常に興味深いと私はに慣れていないんだし、Windows 10で、私はNetbeans 8.2 IDEでサポートされていないようだが、私は仕事にそれを得ることができれば、私も興味があるというのJavascriptの形式である:私は置き換えることができreject('Check incognito failed')resolve(false)、私がしたい場合は、isIncognito真か偽かだけのブール値になるには?ありがとう。
ライアン

2
なるほどSyntax Error: await is a reserved word、そしてawait常にasync関数内にある必要があると思います。したがって、このコードは機能しないと思います。
ライアン

1
reject呼び出された場合に例外が発生し、値が返されないため、isIncognito常にそうであるtruefalse、コードの記述方法です。ただし、値を返したい場合は、「解決」を使用することもできます。そしてそれは、環境がどのように処理するかに依存するかもしれませんが、グローバルスコープで待っていますか?グローバルスコープの(async function() { 'everything here' })();
Chrome

2
別の方法isIncognitoとして、結果の代わりにプロミスを保存し、後で非同期関数で実行することlet isIncognito = new Promise( ...etcもできます。そうすると、どこか他の場所に次のような関数があります(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom

1
この回答はChrome 76以降では無効になっています
Cruncher

0

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

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') });

これはもう機能していません(多分それは過去に機能しました)
Alexandru R

2
今私のクロムを更新し、それはまだ動作します。上記と同じように投稿したのに間違えたと言って、今後の視聴者に指摘するだけです(コメントは自由に削除してください。そうした場合は削除します)。
aljgom

0

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

ここでpromiseを使用したソリューション

const isIncognito = () => {
    return new Promise((resolve, reject) => {
      if ("storage" in navigator && "estimate" in navigator.storage) {
        navigator.storage.estimate().then((res) => {
          console.log(`Using ${res.usage} out of ${res.quota} bytes.`);
          if (res.quota < 120000000) {
            resolve(true);
          } else {
            reject(false);
          }
        });
      } else {
        reject(false);
      }
    });
  };

それを使用する方法:

isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))

-10

シークレットモードのドキュメントでは、ウェブサイトの動作が異なることは特にありません。これは答えがノーであることを意味すると私は信じています。


9
私はこの答えが4歳であることを知っていますが、最近Netflixが「シークレット」検出機能を実装しました。シークレットモードでNetflixにアクセスした場合、netflixでは動画を再生できません。
ILikeTacos 2015年

確認済み<Chrome>:「シークレットモードエラーブラウザがシークレットモードになっているようです。」
ピートアルヴィン

確かに事実を語らないので、この投稿は改善されると思います。この回答からすでに上下に証明されているので、誰かがシークレットモードからアクセスしたのか、通常のChromeブラウザからアクセスしたのかを確認したい場合があります。
FortuneSoldier 2018

..私は知っている@ILikeTacosあなたのコメントは、4歳(以上)ですが、私はまだ、私はその1で勝った感じので、Chromeは、意図的に、彼らのシークレット検出を破った
子犬

@Puppyそうですね。しかし、実際にはmishravikas.com/articles/2019-07/…–
Cruncher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.