web-dev-qa-db-fra.com

Les sites Web peuvent-ils détecter si vous utilisez le mode de navigation privée?

La plupart des navigateurs modernes prennent en charge " mode de navigation privée " (également connu sous Chrome comme "mode navigation privée")), où le navigateur n'enregistre aucune information sur le disque concernant votre navigation dans ce mode.

Dans les navigateurs modernes, un site Web peut-il détecter si un utilisateur qui visite le site Web a activé ou non le mode de navigation privée?

La recherche de base que j'ai faite. Voici ce que j'ai pu trouver concernant cette question. Malheureusement, cela ne répond pas vraiment à la question ci-dessus.

  • Une étude de 201 du mode de navigation privée a montré qu'il est possible pour les sites Web de détecter si le navigateur est en mode de navigation privée, en utilisant une attaque de reniflement de l'historique CSS. (En mode de navigation privée, les sites ne sont pas ajoutés à l'historique, vous pouvez donc utiliser l'historique pour vérifier si le visiteur est en mode de navigation privée.) Depuis lors, cependant, les navigateurs modernes ont incorporé défenses - contre attaques CSS reniflant l'historique.

    Par conséquent, je ne m'attendrais pas à ce que cette méthode pour détecter si le navigateur est en mode de navigation privée réussisse plus longtemps. (Je me rends compte que les défenses contre le reniflement de l'histoire sont pas parfaites , mais elles peuvent être assez bonnes pour ces fins.)

  • Il peut y avoir voies pour un site Web que vous visitez savoir si vous êtes actuellement connecté à d'autres sites (pensez: Facebook). Si l'utilisateur est actuellement connecté à d'autres services (comme Facebook), un site Web pourrait vraisemblablement deviner que l'utilisateur n'utilise pas actuellement le mode de navigation privée - ce n'est pas une chose sûre, mais on pourrait peut-être faire une sorte d'inférence probabiliste. Cependant, si l'utilisateur n'est pas connecté à d'autres services, je suppose que tout ce que nous pouvons dire, c'est que nous ne savons pas si le mode de navigation privée est utilisé. Il est possible que cela produise une fuite partielle d'informations, je suppose, mais cela ne semble pas fiable au mieux - si cela fonctionne même. Il est également possible que cela ne fonctionne pas du tout.

Alors, quelqu'un peut-il fournir des informations plus récentes sur la possibilité pour un site Web de tester si ses visiteurs utilisent le mode de navigation privée?

64
D.W.

Je ne suis pas sûr que vous puissiez détecter de manière fiable la navigation privée, mais je pense que vous pourrez peut-être appliquer des heuristiques pour faire une bonne estimation qu'un utilisateur est en utilisant diverses fonctionnalités améliorant la confidentialité. Comme indiqué dans mon commentaire sur la question, si cela est suffisant ou correspond à votre application dépend de ce que vous voulez pouvoir faire en réaction à la détection de la navigation privée. Comme l'a mentionné Sonny Ordell, je ne suis pas sûr non plus que vous puissiez distinguer la navigation privée de l'utilisation ad hoc de diverses fonctionnalités d'amélioration des privilèges (par exemple, effacer manuellement l'historique ou les cookies).

Supposons que vous exploitiez une application Web et que vous souhaitiez détecter le moment où l'un de vos utilisateurs (avec un compte) passe en navigation privée. Je précise que l'utilisateur a un compte, car cette stratégie repose sur le suivi de divers bits de données de comportement. Les aspects de la navigation privée sont (au moins dans Firefox ): historique, entrées de formulaire/recherche, mots de passe, téléchargements, cookies, cache, stockage DOM. Je ne sais pas comment sonder les téléchargements, mais je pense que les autres peuvent être sondés. Si vous obtenez une détection positive sur chacun d'eux, il semble plus probable que votre utilisateur navigue en privé.

  • Dans le cas trivial, vous gardez une trace de (IP, user-agent) pour chaque utilisateur. Lorsque vous recevez une demande sans cookie pour une correspondance (IP, UA) record, vous pouvez déduire que l'utilisateur correspondant navigue en privé. Cette méthode échoue (pas de détection) si:

    1. Il utilise quelque chose comme ProxySwitchy ou TorButton pour activer Tor pendant la navigation privée, changeant ainsi l'IP.
    2. Il passe à un autre navigateur (par exemple, utilise généralement FF et passe à Chrome pour le mode navigation privée).
    3. Le passage à la navigation privée n'est pas immédiat et son FAI a délivré une nouvelle adresse IP (par exemple, vendredi, il était le 10.1.2.3, il n'a pas utilisé votre application pendant le week-end, et le lundi, il est le 10.1.4.5).

    Comme mentionné dans réponse de Sonny Ordell , si une autre personne utilise le même navigateur en mode de navigation privée pour accéder à un compte distinct sur votre site, vous obtiendrez une détection - mais c'est un cas légèrement différent que si l'utilisateur "normal" passe simplement en mode de navigation privée.

    Vous obtiendrez un faux positif si l'utilisateur efface simplement ses cookies pour votre site, ou utilise un profil secondaire (par exemple, je garde quelques profils Firefox différents avec différents ensembles de plugins pour certains tests et/ou pour éviter le suivi, bien que je Je suppose que c'est très rare).

  • Pour une vérification plus complexe, vous pouvez utiliser quelque chose comme panopticlick d'EFF et conserver une empreinte digitale du navigateur (ou une collection d'empreintes digitales) au lieu de simplement l'UA pour chaque utilisateur. Cela échoue dans la situation 2 mentionnée ci-dessus (par exemple si l'utilisateur utilise exclusivement FF pour une navigation identifiable et Chrome pour incognito). L'empreinte digitale sera beaucoup plus générique (et donc beaucoup moins utile) si l'utilisateur a javascript désactivé. L'empreinte digitale changera si l'utilisateur active sélectivement javascript dans différentes sessions (par exemple NoScript avec des sites temporairement autorisés).

  • Vous pouvez peut-être vaincre le problème 1 (Tor) en détectant l'accès via un nœud de sortie Tor et en combinant cela avec les empreintes digitales. Il semble que cela ne serait utile que dans un petit nombre de cas.

  • Au lieu de simplement des cookies pour les vérifications ci-dessus, testez localStorage. S'il est généralement activé et que votre clé n'est pas dans le stockage pour cette visite et que l'empreinte digitale correspond, il s'agit probablement d'une navigation privée. De toute évidence, si l'utilisateur a normalement désactivé le stockage, vous ne pouvez pas l'utiliser. Les modes de défaillance sont similaires à ceux décrits ci-dessus pour les cookies.

  • Je n'ai pas testé ou développé l'idée, mais je suppose que vous pourriez jouer à des jeux avec Cache-Control. (Un rapide recherche révèle que ce n'est pas une idée originale - ce projet a ce qui ressemble à du code de preuve de concept.) Cette stratégie échoue si l'utilisateur va via un proxy de mise en cache partagé - la page en attendant mentionne anonymizer.com. Firefox, au moins, n'utilise pas le cache en mode de navigation privée. (Voir ce site pour une démonstration du suivi basé sur le cache.) Vous pouvez donc combiner cela avec l'AU/empreinte digitale mentionné ci-dessus: si votre traqueur de cache indique qu'il s'agit d'une première visite, alors vous pouvez deviner que l'utilisateur navigue en privé. Cela échoue avec un faux positif si l'utilisateur nettoie son cache; combiner avec d'autres techniques pour obtenir une meilleure estimation.

  • Vous pouvez détecter et suivre, pour chaque utilisateur, si le navigateur remplit automatiquement un certain élément de formulaire. Si vous détectez qu'un utilisateur donné n'obtient pas de remplissage automatique sur cet élément de formulaire, vous pouvez déduire la navigation privée. C'est fragile - peut-être que l'utilisateur n'utilise pas son ordinateur "principal", mais vous pouvez le combiner avec les empreintes digitales comme mentionné ci-dessus pour une estimation plus fiable.

  • Attaque temporelle par canal latéral: détectez et suivez le temps typique nécessaire à chaque utilisateur pour se connecter à votre application. Il y aura des variations, mais je suppose que vous pourriez obtenir une estimation précise si quelqu'un utilise le remplissage automatique du mot de passe. Si un utilisateur utilise normalement le remplissage automatique du mot de passe (c'est-à-dire une transition rapide à travers la page de connexion), puis pour une visite donnée (avec une empreinte digitale correspondante) n'utilise pas le remplissage automatique, vous pouvez déduire la navigation privée. Encore une fois, c'est fragile; combiner avec d'autres techniques pour une meilleure estimation. Vous voudrez également détecter et corriger la latence du réseau sur un chargement de page donné (par exemple, le réseau de l'utilisateur est juste lent un jour donné, et une transition de page de connexion lente est juste une latence et non un manque de remplissage automatique). Vous pouvez être légèrement pervers et déconnecter automatiquement l'utilisateur (lui donner un faux message d'erreur, "veuillez réessayer") pour obtenir un deuxième point de données si vous êtes prêt à ennuyer un peu vos utilisateurs.

  • Combinez cela avec ce que vous avez mentionné dans la question sur la détection si l'utilisateur est connecté à d'autres services (par exemple Facebook), et vous pouvez avoir plus confiance en votre supposition.

  • Si vous êtes vraiment motivé, vous pouvez jouer à des jeux avec DNS et suivre les temps de chargement des pages. Un test rapide de FF 3.6 et Chrome 15 semble indiquer qu'aucun des deux navigateurs n'efface le cache DNS en mode de navigation privée. Et le navigateur n'a absolument aucun contrôle sur le cache DNS du système local. Si vous utilisez une attaque de synchronisation DNS sur canal latéral pour effectuer le suivi des utilisateurs comme alternative (ou en plus) à la prise d'empreintes digitales, vous pouvez obtenir une estimation plus fiable. Je ne suis pas sûr de la fiabilité du suivi via la synchronisation DNS.

La détection d'utilisateurs "anonymes" en mode de navigation privée sera beaucoup plus difficile, car vous n'avez pas eu la possibilité d'accumuler des données sur leur comportement "typique". Et, comme la plupart des fonctionnalités ne démarrent qu'à la fin de la session du navigateur, vous ne savez pas vraiment si elles reviendront un jour.

Cela dit, voici une idée pour détecter la navigation privée par des utilisateurs anonymes, si vous êtes prêt à être méchant, et vous aviez une ressource pour laquelle vous saviez qu'un utilisateur était prêt à donner à votre site une deuxième chance, et vous pouvez forcer la utilisateur pour activer javascript. Suivez les empreintes digitales, définissez un cookie persistant, localStorage, cache - tout ce que vous pouvez faire pour suivre l'utilisateur. S'il s'agit d'une première visite en fonction de votre empreinte digitale, plantez/bloquez le navigateur via javascript (ou flash, ou tout autre truc que vous connaissez). Aspirez des tonnes de mémoire, ou restez coincé dans une boucle, ou tout ce qu'il faut pour que l'utilisateur ferme le navigateur. Puis quand ils reviennent, vous voyez (à partir de l'empreinte digitale) que c'est une deuxième visite. Si le cookie/stockage/cache/etc ne sont pas définis, vous pouvez déduire que la première session était une navigation privée, et je suppose que vous pourriez déduire que la deuxième session est probablement également une navigation privée. Cela échoue évidemment si l'utilisateur ne revient pas, ou si vous ne pouvez pas le planter/le convaincre de tuer la fenêtre du navigateur. En prime, si vous les envoyez à une URL personnalisée, qu'ils sont en mode non privé et que vous restaurez la session de navigation, vous pouvez deviner qu'ils ne sont pas en mode de navigation privée (sauf s'ils ont mis en signet l'URL).

Tout ce qui précède est plein de trous - beaucoup de place pour les faux positifs ou négatifs. Vous ne saurez probablement jamais si j'utilise la navigation privée ou si j'utilise un navigateur dans un VM sans stockage persistant. (Quelle est la différence?)

Le pire est probablement que si vous obtenez une réponse avec une méthode fiable pour détecter la navigation privée, il semble peu probable qu'elle reste viable aussi longtemps que les navigateurs le "corrigent" ou les utilisateurs trouvent des solutions pour éviter la détection.

30
bstpierre

La vérification du stockage local HTML 5 vous permet de détecter de manière fiable le mode de navigation privée maintenant (2019). Il fonctionne en essayant d'écrire puis de lire "Local Storage".

voir:

https://Gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1

ou

https://github.com/jLynx/PrivateWindowCheck avec PoC

  ------ edit to add functional description ----

À partir du lien jherax ci-dessus:

...
    // **Firefox**
    if ('MozAppearance' in document.documentElement.style) {
      if (indexedDB === null) return yes();
      const db = **indexedDB.open**('test');
      db.onerror = yes;
      db.onsuccess = not;
      return void 0;
---

De jLynx ci-dessus

...
        } else if(navigator.userAgent.includes("Firefox")){
            //Firefox
            var db = indexedDB.open("test");
            db.onerror = function(){resolve(true);};
            db.onsuccess =function(){resolve(false);};
---

Dans les deux exemples, l'échec de l'ouverture du stockage local persistant, indexDB pour Firefox, (défini par HTML 5) indique navigation privée. D'autres navigateurs appellent le stockage local sous différents noms tels que localStorage, allez comprendre.

10
user10216038

Vous pouvez utiliser l'heuristique pour faire une supposition solide. Dans IE10 et IE11 (et Safari, IIRC), par exemple, des exceptions levées lors de la tentative d'utilisation d'IndexedDB comme indice fort que le navigateur est en mode InPrivate.

De même, le système DRM d'Adobe (utilisé par HBOGO, apparemment) fait apparaître un code d'erreur lorsque le navigateur est InPrivate/Incognito, car les "artefacts de licence" requis ne peuvent pas être créés en mode privé. https://forums.Adobe.com/thread/1189199

8
EricLaw

Je vois qu'il y a une récompense parce que vous voulez une réponse plus précise et à jour, mais la vérité est que la bonne réponse a déjà été donnée par d'autres. Je peux juste vous donner quelques détails supplémentaires, même si je ne suis pas développeur JS et que je n'ai jamais su non plus comment cela fonctionne.

La réponse courte est: ils utilisent JavaScript pour implémenter une sorte d'heuristique qui vérifie principalement si certaines fonctionnalités sont disponibles ou non.

Jetez un œil à bostonglobe.com Par exemple. Cliquez sur un article en mode privé et vous verrez l'avis: "Vous êtes en mode privé, etc.". Si vous désactivez JavaScript, cette notification n'apparaîtra pas, ce qui signifie que cela se fait dans JS. La même chose est vraie si vous allez au New York Times, c'est juste JS. Mais comment font-ils exactement? Sur bostonglobe.com, J'ai trouvé le code dans un fichier JS nommé meter.js Dans la source. Si vous recherchez dans ce code pour detectPrivateMode, vous verrez la fonction qu'il utilise. C'est minifié, donc c'est pénible à lire. Prettifier la source dans les outils de développement du navigateur donne cependant le code suivant:

detectPrivateMode: function (t) {
  var e;
  if (window.webkitRequestFileSystem) window.webkitRequestFileSystem(window.TEMPORARY, 1, function () {
    e = !1
  }, function (t) {
    console.log(t),
    e = !0
  });
   else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
    var i;
    try {
      i = window.indexedDB.open('test')
    } catch (t) {
      e = !0
    }
    void 0 === e && n(function () {
      return 'done' === i.readyState
    }, function (t) {
      t || (e = !i.result)
    })
  } else if (r(window.navigator.userAgent)) {
    e = !1;
    try {
      window.indexedDB || (e = !0)
    } catch (t) {
      e = !0
    }
  } else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
    if (window.safariIncognito) e = !0;
     else {
      try {
        window.openDatabase(null, null, null, null)
      } catch (t) {
        e = !0
      }
      try {
        window.localStorage.setItem('test', 1)
      } catch (t) {
        e = !0
      }
    }
    void 0 === e && (e = !1, window.localStorage.removeItem('test'))
  }
  n(function () {
    return void 0 !== e
  }, function (n) {
    t(e)
  })
}

Vous pouvez voir par exemple qu'ils essaient d'utiliser window.webkitRequestFileSystem, Dans Firefox ils essaieront window.indexedDB.open('test'), dans Safary window.openDatabase, Et ainsi de suite. Toutes ces fonctions semblent reposer sur le fait qu'elles se comportent différemment en mode privé (mode incognito). La plupart du code semble utiliser des fonctions liées au stockage local, qui se comportent apparemment différemment qu'en mode normal. Il y a plusieurs blocs try-catch, donc la plupart de ces fonctions ne sont probablement même pas disponibles en mode privé. Si vous recherchez sur Google l'une de ces fonctions (en ajoutant peut-être "privé" ou "incognito" dans la recherche), vous trouverez de nombreux résultats discutant des façons possibles de détecter le mode privé, et à la fin le code que vous trouverez ressemblera très similaire à celui que j'ai cité. Vous trouverez plusieurs questions sur StackExchange ainsi que des extraits de code GitHub. Par exemple, cette réponse sur StackExchange contient des informations intéressantes: https://stackoverflow.com/a/4132218

Dans le New York Times, si vous cliquez sur un article, ouvrez la source HTML et recherchez webkitRequestFileSystem, vous trouverez un code similaire.

Comme vous pouvez le voir, il peut y avoir des différences dans le code et les heuristiques qu'ils utilisent, mais chaque site Web détecte probablement le mode privé en s'appuyant sur le même petit ensemble de fonctions.

6
reed

Apparemment, il existe des moyens que les sites Web peuvent détecter lorsque vous êtes en mode de navigation privée, pour Safari de bureau et Safari mobile .

Desktop Safari ne demande pas de favicons en mode de navigation privée, ce qui révèle des choses. Il a également autres différences .

Mobile Safari ne prend pas en charge le stockage local HTML5 en mode de navigation privée, qui est également détectable par les sites Web.

3
D.W.

En mars 2020, il semble qu'il soit encore possible pour les sites de détecter si Firefox fonctionne ou non en mode privé, étant donné que IndexedDB ne fonctionne pas lorsque Firefox fonctionne en mode privé. Il existe un certain nombre de médias grand public qui semblent utiliser la technique pour empêcher les utilisateurs de naviguer sur leur site en mode privé, ou les forcer à se connecter.

GitHub Gist avec exemple de code:
https://Gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1

Démo de travail du code ci-dessus:
https://output.jsbin.com/tazuwif

Fils de Bugzilla avec plus d'informations:
https://bugzilla.mozilla.org/show_bug.cgi?id=781982
https://bugzilla.mozilla.org/show_bug.cgi?id=150668

1
mti2935

La réponse simple est non.

Détecter simplement que l'historique n'est pas enregistré ne signifie pas que le mode de navigation privée est utilisé, cela signifie simplement que l'historique n'est pas enregistré, quelque chose de facile à configurer dans n'importe quel navigateur.

Pourquoi être connecté à un autre service signifie que vous n'utilisez pas le mode de navigation privée? J'utilise souvent Facebook en mode de navigation privée sur les ordinateurs d'autres personnes, car cela signifie que je n'ai pas à les déconnecter et c'est un moyen facile d'avoir ma propre session sans perdre leur état.

Le mode de navigation privée active simplement les fonctionnalités que vous pouvez configurer vous-même en mode normal. Il permet plusieurs fonctionnalités à la fois pendant une période temporaire pour plus de commodité. Il n'y a aucun moyen de savoir si quelqu'un utilise le mode de navigation privée ou s'il a simplement ces fonctionnalités activées.

0
Sonny Ordell