webentwicklung-frage-antwort-db.com.de

Können Sie über ein Skript feststellen, ob sich Chrome im Inkognito-Modus befindet?

Kann ich über ein Skript feststellen, ob sich Google Chrome im Inkognito-Modus befindet?

Bearbeiten: Eigentlich meinte ich, dass es über ein Benutzerskript möglich ist, aber die Antworten gehen davon aus, dass JavaScript auf einer Webseite ausgeführt wird. Ich habe die Frage hier in Bezug auf Benutzerskripte erneut gestellt.

105
RodeoClown

Ja. Die FileSystem-API ist im Inkognito-Modus deaktiviert. Überprüfen Sie https://jsfiddle.net/w49x9f1a/ , wann Sie sich im Inkognito-Modus befinden und wann nicht.

Beispielcode:

    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

Eine Möglichkeit besteht darin, eine eindeutige URL zu besuchen und dann zu überprüfen, ob ein Link zu dieser URL von CSS als besucht behandelt wird.

Ein Beispiel dafür finden Sie in "Inkognito erkennen" (Dead Link) .

Forschungsarbeit desselben Autors als Ersatz für den obigen Link "Detecting Incognito"

Fügen Sie in main.html Einen iframe hinzu,

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

, und etwas JavaScript-Code:

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

Dann in test.html, Die in den iFrame geladen werden:

<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> 

HINWEIS: Wenn Sie dies über das Dateisystem versuchen, kann Chrome über "Unsicheres Javascript" weinen. Es funktioniert jedoch von einem Webserver aus.

18
JHurrah

Sie können in JavaScript JHurrahs Antwort sehen. Abgesehen davon, dass Links nicht hervorgehoben werden, werden im Inkognito-Modus kein Browserverlauf und keine Cookies gespeichert. Von Google Hilfeseite :

  • Webseiten, die Sie öffnen und heruntergeladene Dateien, während Sie inkognito sind, werden in Ihrem Browsing- und Download-Verlauf nicht aufgezeichnet.
  • Alle neuen Cookies werden gelöscht, nachdem Sie alle Inkognito-Fenster geschlossen haben, die Sie geöffnet haben.

Wie Sie sehen können, treten die Unterschiede zwischen normalem Browsen und Inkognito auf , nachdem Sie die Webseite besucht haben . In diesem Fall kommuniziert der Browser nicht mit dem Server Modus.

Sie können sehen, was genau Ihr Browser mit einem der vielen HTTP-Anforderungsanalysatoren an den Server sendet, z. B. dieser hier . Vergleichen Sie die Überschriften zwischen normaler Sitzung und inkognito, und Sie werden keinen Unterschied feststellen.

8
Igor Zevaka

Wenn Sie eine Erweiterung entwickeln, können Sie mithilfe der Registerkarten-API feststellen, ob ein Fenster/eine Registerkarte inkognito ist.

Weitere Informationen finden Sie hier .

Wenn Sie nur mit einer Webseite arbeiten, ist dies nicht einfach und so konzipiert. Ich habe jedoch festgestellt, dass alle Versuche, eine Datenbank (window.database) zu öffnen, in inkongnito fehlschlagen. Dies liegt daran, dass in inkognito keine Datenspur auf dem Computer des Benutzers verbleiben darf.

Ich habe es nicht getestet, aber ich vermute, dass alle Aufrufe von localStorage ebenfalls fehlschlagen.

4
Kinlan

Dies verwendet ein Versprechen, um zu warten, bis der asynchrone Code ein Flag gesetzt hat, damit wir ihn anschließend synchron verwenden können.

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

dann können wir tun

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

In Chrome 74+ können Sie dies durch Schätzen des verfügbaren Dateisystemspeicherplatzes ermitteln

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

Hier ist die vorgeschlagene Antwort in ES6-Syntax und leicht bereinigen.

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

Schnelle Copy-Paste-Funktion basierend auf Aloks Antwort (Hinweis: Dies ist asynchron)

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, ()=>{});
    }
} 

verwendung:

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