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

113

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

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

RodeoClown
quelle
28
Es wäre nicht sehr, incognitowenn Sie es leicht bestimmen könnten :)
Aren
Und Sie müssen bedenken, dass der Benutzer den Inkognito-Modus für das Erweiterungshandbuch zulassen muss. Standardmäßig ist alles wahr.
Mohamed Mansour
@Mohamed: Der Benutzer, der es zulassen muss, wäre ich, also ist das kein Problem :)
RodeoClown
1
@PeteAlvin Oder die Site könnte den Wert durch Inkognito-Erkennung beeinträchtigen. Auf der Website von Boston Globe werden die Artikel nicht inkognito angezeigt, sodass der Benutzer die Quote für kostenlose Artikel nicht umgehen kann. Im Allgemeinen bevorzuge ich eine Website, die weniger über mich weiß.
JohnC

Antworten:

231

Ja. Die FileSystem-API ist im Inkognito-Modus deaktiviert. Überprüfen Sie https://jsfiddle.net/w49x9f1a/, wenn Sie sich im Inkognito-Modus befinden und 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"));
    }

Alok
quelle
19
Dies ist der am wenigsten hackige Weg und sollte an der Spitze stehen. Sauber und elegant.
Tom Teman
1
@ user2718671 jsfiddle.net/w49x9f1a funktioniert in der neuesten Version von Chrome auf Mac OSX immer noch einwandfrei. komisch ...
Alok
1
Ich habe es bei Chrome versucht. Es funktioniert, aber die Logik ist rückwärts.
Lucas Massuh
9
Das wird gehen weg bald dank dieser Commits
blueren
6
Fehler in Chrome v 77.0.3865.90
Gitesh Purbia
18

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

Ein Beispiel hierfür finden Sie unter "Erkennen von Inkognito" (toter Link) .

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

In main.htmlfügen Sie ein iframe,

 <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 test.htmlwerden in den iFrame geladen:

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

JHurrah
quelle
Das ist ziemlich cool, ich habe nicht bemerkt, dass der Inkognito-Modus besuchte Links nicht hervorhebt. Dies erfordert jedoch, dass der Benutzer auf einen Link klickt.
Igor Zevaka
1
Nein, der Iframe "klickt" auf den Link.
Kibibu
40
Dies funktioniert nicht wirklich, da die meisten Browser Folgendes nicht offenlegen: besuchte Stilinformationen über Javascript. Die CSS-Oberfläche sagt, dass der Link die nicht besuchte Farbe hat. Dies ist eine Sicherheitsmaßnahme, die mindestens seit 2010 in WebKit- und Gecko-Browsern angewendet wird. Dies diente dem Schutz des Benutzerverlaufs (z. B. könnte man alle möglichen URLs ausprobieren und die besuchten an Dritte senden. Auf diese Weise könnte man sie erhalten Zugriff auf Token in URLs und was nicht).
Timo Tijhof
2
Offizieller Mozilla-Artikel, der die Datenschutzänderungen in Bezug auf :visited: hacks.mozilla.org/2010/03/…
Denilson Sá Maia
16

In Chrome 74+ können Sie dies ermitteln, indem Sie den verfügbaren Speicherplatz des Dateisystems schätzen

Siehe die 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')
}
Vinnie James
quelle
4
Dies ist jetzt die richtige Antwort. Entweder sollte die akzeptierte Antwort damit aktualisiert werden, oder die akzeptierte Antwort sollte sich ändern. Nicht von der ursprünglich akzeptierten Antwort wegzunehmen, da dies zu der Zeit die richtige Lösung war.
Cruncher
8

Sie können in JavaScript die Antwort von JHurrah sehen . Abgesehen davon, dass Links nicht hervorgehoben werden, werden im Inkognito-Modus nur der Browserverlauf und die Cookies nicht gespeichert. Von der Google- Hilfeseite :

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

Wie Sie sehen können, treten die Unterschiede zwischen normalem Surfen und Inkognito nach dem Besuch der Webseite auf. Daher kommuniziert der Browser in diesem Modus nichts mit dem Server.

Mit einem der vielen HTTP-Anforderungsanalysatoren wie diesem können Sie sehen, was genau Ihr Browser an den Server sendet . Vergleichen Sie die Header zwischen normaler Sitzung und Inkognito, und Sie werden keinen Unterschied feststellen.

Igor Zevaka
quelle
In letzter Zeit werden alle Erweiterungen außer den Erweiterungen deaktiviert, die vom Benutzer speziell als inkognito-sicher markiert wurden.
Tiberiu-Ionuț Stan
4

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 incongnito fehlschlagen. Dies liegt daran, dass in inkognito keine Datenspur auf dem Computer des Benutzers zurückbleiben darf.

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

Kinlan
quelle
3

Dies verwendet ein Versprechen, darauf zu warten, dass der asynchrone Code ein Flag setzt, damit wir es 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');
aljgom
quelle
Das sieht sehr interessant und ist eine Form von Javascript , dass ich nicht vertraut bin mit und scheint nicht unterstützt durch mein Netbeans 8.2 IDE in Windows 10. Aber wenn ich es an die Arbeit zu bekommen, ich bin auch neugierig: Kann ich ersetzen reject('Check incognito failed')mit , resolve(false)wenn ich will isIncognitoein Boolescher Wert zu sein, der immer nur wahr oder falsch ist? Vielen Dank.
Ryan
2
Ich verstehe Syntax Error: await is a reserved wordund denke, dass es awaitimmer innerhalb einer asyncFunktion sein muss. Ich denke, dieser Code funktioniert nicht.
Ryan
1
rejectwürde eine Ausnahme auslösen, wenn es aufgerufen wird, und ein Wert würde nicht zurückgegeben, so isIncognitowäre es immer trueoder falsewie der Code geschrieben wird. Sie können dort jedoch auch eine 'Auflösung' verwenden, wenn Sie einen Wert zurückgeben möchten. Und es könnte davon abhängen, wie die Umgebung im globalen Bereich wartet? Es funktioniert auf der Chrome-Konsole im globalen Bereich, aber Sie können versuchen, alles (async function() { 'everything here' })();
einzuschließen,
2
Alternativ können Sie das Versprechen auch einfach isIncognitoanstelle des Ergebnisses speichern und anschließend in einer asynchronen Funktion ausführen: let isIncognito = new Promise( ...etcDann hätten Sie woanders eine Funktion wie(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom
1
Diese Antwort ist in Chrom 76+
Cruncher
0

Schnelle Funktion zum Kopieren und Einfügen 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') });
aljgom
quelle
das funktioniert nicht mehr (vielleicht hat es in der Vergangenheit funktioniert)
Alexandru R
2
Habe gerade mein Chrome aktualisiert und es funktioniert immer noch. Ich sehe, dass Sie das Gleiche oben gepostet haben und dann gesagt haben, dass Sie sich geirrt haben, und dies nur für zukünftige Zuschauer hervorgehoben haben (zögern Sie nicht, Ihren Kommentar zu löschen, ich werde diesen löschen, wenn Sie dies tun).
Aljgom
0

Hier ist die vorgeschlagene Antwort, die in ES6-Syntaxt geschrieben und leicht bereinigt wurde.

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)
Nikksan
quelle
0

Hier verspricht die Lösung

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

Und wie man es benutzt:

isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
Juan Ricardo
quelle
-10

In der Dokumentation zum Inkognito-Modus heißt es ausdrücklich, dass sich Websites nicht anders verhalten. Ich glaube, das bedeutet, dass die Antwort nein ist.

Hündchen
quelle
9
Ich weiß, dass diese Antwort 4 Jahre alt ist, aber kürzlich hat Netflix die "Inkognito" -Erkennung implementiert, und das hat mein Interesse geweckt, zu untersuchen, wie sie das erreichen. Wenn Sie Netflix inkognito besuchen, können Sie mit Netflix keine Videos abspielen.
ILikeTacos
Verifiziertes <Chrome>: "Fehler im Inkognito-Modus Ihr Browser scheint sich im Inkognito-Modus zu befinden."
Pete Alvin
Ich denke, dieser Beitrag könnte verbessert werden, da er sicherlich keine Fakten enthält. Wie aus dieser Antwort bereits hervorgeht, kann man sehen, ob jemand sehen möchte, ob er vom Inkognito-Modus oder von einem normalen Chrome-Browser aus besucht wird.
FortuneSoldier
@ILikeTacos Ich weiß, dass Ihr Kommentar (mehr als) vier Jahre alt ist, aber Chrome hat absichtlich ihre Inkognito-Erkennung gebrochen, so dass ich immer noch das Gefühl habe, dass ich bei diesem gewonnen habe.
Welpe
@ Welpe Na ja. Aber eigentlich keine mishravikas.com/articles/2019-07/…
Cruncher