web-dev-qa-db-fra.com

Pouvez-vous déterminer si Chrome est en mode de navigation privée via un script?

Est-il possible de déterminer si Google Chrome est en mode de navigation privée via un script?)

Edit: Je voulais en fait dire si c'était possible via un script utilisateur, mais les réponses supposent que JavaScript est en cours d'exécution sur une page Web. J'ai redemandé la question ici en ce qui concerne les scripts utilisateur.

105
RodeoClown

Oui. L'API FileSystem est désactivée en mode navigation privée. Départ https://jsfiddle.net/w49x9f1a/ lorsque vous êtes et n'êtes pas en mode de navigation privée.

Exemple de code:

    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

Une solution consiste à visiter une URL unique, puis à vérifier si un lien vers cette URL est traité comme visité par CSS.

Vous pouvez voir un exemple de cela dans "Détecter Incognito" (lien mort) .

article de recherche du même auteur remplaçant le lien Détecter Incognito ci-dessus

Dans main.html ajouter un iframe,

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

, et du code 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 = '';
}

Puis dans test.html qui sont chargés dans l’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> 

NOTE: essayer ceci depuis le système de fichiers peut faire Chrome pleurer à propos de "Javascript non sécurisé". Cela fonctionnera cependant à partir d'un serveur web.

18
JHurrah

Vous pouvez, en JavaScript, voir JHurrah's answer . Excepté pour ne pas mettre en évidence les liens, tout le mode incognito ne sauvegarde pas l'historique de navigation et les cookies. De google page d'aide :

  • Les pages Web que vous ouvrez et les fichiers téléchargés en mode de navigation privée ne sont pas enregistrés dans votre historique de navigation et de téléchargement.
  • Tous les nouveaux cookies sont supprimés après la fermeture de toutes les fenêtres de navigation privée que vous avez ouvertes.

Comme vous pouvez voir les différences entre la navigation normale et incognito se produisent après la page Web consultée, le navigateur ne communique donc rien avec le serveur lorsqu'il est dans cette mode.

Vous pouvez voir ce que votre navigateur envoie exactement au serveur en utilisant l'un des nombreux analyseurs de requêtes HTTP, comme celui-ci ici . Comparez les en-têtes entre session normale et incognito et vous ne verrez aucune différence.

8
Igor Zevaka

Si vous développez une extension, vous pouvez utiliser l’API des onglets pour déterminer si une fenêtre/un onglet incognito.

Plus d'informations peuvent être trouvées ici .

Si vous travaillez uniquement avec une page Web, ce n'est pas facile, et c'est conçu pour être ainsi. Cependant, j'ai remarqué que toutes les tentatives pour ouvrir une base de données (window.database) échouaient lorsqu'elles étaient incongnito. En effet, lorsqu'elles étaient incognito, aucune trace de données n'était autorisée à rester sur la machine des utilisateurs.

Je ne l'ai pas testé mais je soupçonne que tous les appels vers localStorage ont également échoué.

4
Kinlan

Cela utilise une promesse d’attendre que le code asynchrone mette un indicateur afin que nous puissions l’utiliser ensuite de manière synchrone.

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

alors nous pouvons faire

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

Dans Chrome 74+, vous pouvez le déterminer par estimation de l'espace de stockage disponible du système de fichiers)

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

Voici la réponse suggérée, écrite en syntaxe ES6 et légèrement nettoyée.

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

Fonction copier-coller rapide basée sur Alok's Answer (note: ceci est asynchrone)

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

usage:

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