it-swarm.dev

I siti Web possono rilevare se si sta utilizzando la modalità di navigazione privata?

I browser più moderni supportano " modalità di navigazione privata " (noto anche in Chrome come "Modalità di navigazione in incognito"), in cui il browser non salva alcuna informazione sul disco relativa alla tua navigazione mentre in questa modalità.

Nei browser moderni, un sito Web può rilevare se un utente che sta visitando il sito Web ha la modalità di navigazione privata abilitata o no?

La ricerca di base che ho fatto. Ecco cosa sono riuscito a trovare in relazione a questa domanda. Sfortunatamente, in realtà non risponde alla domanda sopra.

  • Uno studio del 201 della modalità di navigazione privata ha mostrato che è possibile per i siti Web rilevare se il browser è in modalità di navigazione privata, utilizzando un attacco di sniffing della cronologia CSS. (Nella modalità di navigazione privata, i siti non vengono aggiunti alla cronologia, quindi puoi utilizzare lo sniffing della cronologia per verificare se il visitatore è in modalità di navigazione privata.) Da allora, tuttavia, i browser moderni hanno incorporato difese - contro attacchi sniffing cronologia CSS.

    Di conseguenza, non mi aspetto che quel metodo per rilevare se il browser è in modalità di navigazione privata avrà più successo. (Mi rendo conto che le difese contro lo sniffing della storia sono non perfette , ma potrebbero essere abbastanza buone per questi scopi.)

  • Ci possono essere modi per un sito web che stai visitando impara se sei attualmente connesso ad altri siti (pensa: Facebook). Se l'utente è attualmente connesso ad altri servizi (come Facebook), un sito Web potrebbe indovinare plausibilmente che l'utente non sta attualmente utilizzando la modalità di navigazione privata - questa non è una cosa certa, ma forse si potrebbe fare una sorta di inferenza probabilistica. Tuttavia, se l'utente non ha effettuato l'accesso ad altri servizi, suppongo che tutto ciò che possiamo dire è che non sappiamo se è in uso la modalità di navigazione privata. È possibile che ciò possa produrre una perdita parziale di informazioni, suppongo, ma nella migliore delle ipotesi sembra inaffidabile, se funziona. È anche possibile che questo potrebbe non funzionare affatto.

Quindi, qualcuno può fornire informazioni più recenti sul fatto che un sito Web possa verificare se i suoi visitatori utilizzano la modalità di navigazione privata?

64
D.W.

Non sono sicuro che potresti in modo affidabile rilevare la navigazione privata, ma penso che potresti essere in grado di applicare alcune euristiche per fare una buona idea che un utente sia utilizzando varie funzionalità di miglioramento della privacy. Come indicato nel mio commento sulla domanda, se questo è abbastanza buono o adatto alla tua applicazione dipende da cosa vuoi essere in grado di reagire al rilevamento della navigazione privata. Come ha detto Sonny Ordell, non sono nemmeno sicuro che tu possa distinguere la navigazione privata dall'uso ad hoc di varie funzionalità che migliorano la privacy (ad es. Cancellare manualmente la cronologia o i cookie).

Supponiamo che tu gestisca un'applicazione Web e desideri rilevare quando uno dei tuoi utenti (con un account) passa alla navigazione privata. Sto specificando che l'utente ha un account, perché questa strategia si basa sul tracciamento di vari bit di dati comportamentali. Gli aspetti della navigazione privata sono (almeno in Firefox ): cronologia, voci di modulo/ricerca, password, download, cookie, cache, archiviazione DOM. Non sono sicuro di come cercare i download, ma penso che gli altri possano essere analizzati. Se ricevi un rilevamento positivo su tutti, sembra più probabile che il tuo utente stia navigando in privato.

  • Nel caso banale, tieni traccia di (IP, user-agent) per ciascun utente. Quando ricevi una richiesta senza cookie per una corrispondenza (IP, UA) record, potresti dedurre che l'utente corrispondente è la navigazione privata. Questo metodo fallisce (nessun rilevamento) se:

    1. Usa qualcosa come ProxySwitchy o TorButton per attivare Tor durante la navigazione privata, cambiando così l'IP.
    2. Passa a un browser diverso (ad esempio, di solito utilizza FF e passa a Chrome per la modalità di navigazione in incognito).
    3. Il passaggio alla navigazione privata non è immediato e il suo ISP ha rilasciato un nuovo IP (ad es. Venerdì aveva 10.1.2.3, non ha usato la tua app durante il fine settimana e lunedì è 10.1.4.5).

    Come menzionato in risposta di Sonny Ordell , se un'altra persona utilizza lo stesso browser in modalità di navigazione privata per accedere a un account separato sul tuo sito, otterrai un rilevamento - ma questo è un caso leggermente diverso rispetto a se l'utente "normale" passa semplicemente alla modalità di navigazione privata.

    Otterrai un falso positivo se l'utente cancella semplicemente i suoi cookie per il tuo sito o utilizza un profilo secondario (ad esempio, mantengo alcuni profili di Firefox diversi con diversi set di plug-in per determinati test e/o per evitare il tracciamento, sebbene io immagino che questo sia molto raro).

  • Come controllo più complesso, è possibile utilizzare qualcosa come panopticlick di EFF e mantenere un'impronta digitale del browser (o una raccolta di impronte digitali) anziché solo la UA per ciascun utente. Ciò non riesce nella situazione 2 sopra menzionata (ad esempio se l'utente utilizza FF esclusivamente per la navigazione identificabile e Chrome per la navigazione in incognito). L'impronta digitale sarà molto più generica (e quindi molto meno utile) se l'utente javascript è disabilitato. L'impronta digitale cambierà se l'utente abilita selettivamente javascript in sessioni diverse (es. NoScript con siti temporaneamente consentiti).

  • Potresti riuscire a sconfiggere il problema 1 (Tor) rilevando l'accesso tramite un nodo di uscita Tor e combinandolo con l'impronta digitale. Sembra che sarebbe utile solo in una ristretta gamma di casi.

  • Invece di solo i cookie per i controlli sopra, prova localStorage. Se in genere è abilitato e la chiave non è nella memoria per questa visita e l'impronta digitale corrisponde, probabilmente si tratta di una navigazione privata. Ovviamente, se l'utente ha normalmente l'archiviazione disabilitata, non è possibile utilizzarla. Le modalità di errore sono simili a quelle sopra descritte per i cookie.

  • Non ho testato o sviluppato l'idea, ma suppongo che potresti giocare con Cache-Control. (Un rapido ricerca rivela che questa non è un'idea originale - quel progetto ha quello che sembra un codice di prova del concetto.) Questa strategia fallisce se l'utente va tramite un proxy di cache condiviso - la pagina nel frattempo menziona anonymizer.com. Firefox, almeno, non utilizza la cache in modalità di navigazione privata. (Vedi questo sito per una demo del tracciamento basato sulla cache.) Quindi potresti combinarlo con l'UA/fingerprinting menzionato sopra: se il tuo tracker di cache indica che questa è una prima visita, allora puoi indovinare che l'utente sta navigando in privato. Ciò fallisce con un falso positivo se l'utente pulisce la sua cache; combinalo con altre tecniche per indovinare meglio.

  • È possibile rilevare e tracciare, per ciascun utente, se il browser riempie automaticamente un determinato elemento del modulo. Se rilevi che un determinato utente non ottiene il riempimento automatico su quell'elemento del modulo, potresti dedurre la navigazione privata. Questo è fragile - forse l'utente non sta usando il suo computer "primario", ma potresti combinarlo con l'impronta digitale come menzionato sopra per un'ipotesi più affidabile.

  • Attacco di temporizzazione sul canale laterale: rileva e traccia il tempo tipico impiegato da ciascun utente per accedere alla tua app. Ci saranno variazioni, ma suppongo che potresti avere un'ipotesi precisa sul fatto che qualcuno stia usando la compilazione automatica della password. Se un utente utilizza normalmente la compilazione automatica della password (ovvero la transizione rapida attraverso la pagina di accesso), e quindi per una determinata visita (con un'impronta digitale corrispondente) non si utilizza la compilazione automatica, è possibile dedurre la navigazione privata. Anche in questo caso è fragile; combinalo con altre tecniche per indovinare meglio. Ti consigliamo inoltre di rilevare e correggere la latenza di rete in un determinato caricamento della pagina (ad es. Forse la rete dell'utente è solo lenta in un determinato giorno e una transizione lenta della pagina di accesso è solo latenza e non mancanza di riempimento automatico). Puoi essere leggermente malvagio e disconnettere automaticamente l'utente (dai loro un falso messaggio di errore, "per favore riprova") per ottenere un secondo punto dati se sei disposto a infastidire un po 'i tuoi utenti.

  • Combina questo con ciò che hai menzionato nella domanda sul rilevamento se l'utente ha effettuato l'accesso ad altri servizi (ad esempio Facebook) e puoi avere più fiducia nelle tue ipotesi.

  • Se sei veramente motivato, potresti giocare con DNS e tempi di caricamento della pagina di monitoraggio. Un rapido test di FF 3.6 e Chrome 15 sembra indicare che nessuno dei due browser cancella la cache DNS in modalità di navigazione privata. E il browser non ha assolutamente alcun controllo sulla cache DNS del sistema locale. Se si utilizza un attacco di temporizzazione DNS del canale laterale per eseguire il tracciamento dell'utente come alternativa (o in aggiunta a) l'impronta digitale, potresti ottenere un'ipotesi più affidabile. Non sono sicuro di quanto sarà affidabile il tracciamento tramite il tempismo DNS.

Il rilevamento di utenti "anonimi" in modalità di navigazione privata sarà molto più difficile, poiché non hai avuto l'opportunità di accumulare dati sul loro comportamento "tipico". E, poiché la maggior parte delle funzionalità si avvia solo quando terminano la sessione del browser, non sai davvero se torneranno mai.

Detto questo, ecco un'idea per rilevare la navigazione privata da parte di utenti anonimi, se sei disposto a essere malvagio e hai avuto qualche risorsa per la quale sapevi che un utente era disposto a dare una seconda possibilità al tuo sito e puoi forzare il utente per abilitare JavaScript. Traccia impronte digitali, imposta un cookie persistente, localStorage, cache - qualunque cosa tu possa fare per tracciare l'utente. Se è una prima visita in base alla tua impronta digitale, blocca/blocca il browser tramite javascript (o flash o qualsiasi altro trucco malvagio che conosci). Succhiare tonnellate di memoria, o rimanere bloccati in un ciclo, o qualsiasi cosa sia necessaria in modo che l'utente chiuda il browser. Quindi quando tornano, vedi (dall'impronta digitale) che è una seconda visita. Se i cookie/archiviazione/cache/etc non sono impostati, allora puoi dedurre che la prima sessione è stata la navigazione privata, e suppongo che potresti dedurre che la seconda sessione è probabilmente anche la navigazione privata. Questo ovviamente fallisce se l'utente non ritorna, o se non riesci a bloccarlo/convincerlo a uccidere la finestra del browser. Come bonus, se li invii a un URL personalizzato, sono in modalità non privata e ripristini la sessione di navigazione, puoi indovinare che non sono in modalità di navigazione privata (a meno che non abbiano aggiunto l'URL ai segnalibri).

Tutto quanto sopra è pieno di buchi - un sacco di spazio per falsi positivi o negativi. Probabilmente non saprai mai se sto usando la navigazione privata o se sto eseguendo un browser in un VM senza memoria permanente. (Qual è la differenza?)

La parte peggiore è probabilmente che se ottieni una risposta con un metodo affidabile per rilevare la navigazione privata è che sembra improbabile che rimanga fattibile per molto tempo i browser lo "riparano" o gli utenti trovano soluzioni alternative per evitare il rilevamento.

30
bstpierre

Il controllo dell'archiviazione locale HTML 5 consente di rilevare in modo affidabile la modalità di navigazione privata ora (2019). Funziona tentando di scrivere, quindi leggi "Memoria locale".

vedere:

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

o

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

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

Dal link jherax sopra:

...
    // **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;
---

Da jLynx sopra

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

In entrambi gli esempi, la mancata apertura della memoria locale persistente, indexDB per Firefox, (definito da HTML 5) indica navigazione privata. Altri browser chiamano l'archiviazione locale con nomi diversi come localStorage, vai a capire.

10
user10216038

È possibile utilizzare l'euristica per fare un'ipotesi solida. In IE10 e IE11 (e Safari, IIRC), ad esempio, vengono emesse eccezioni quando si tenta di utilizzare IndexedDB come un forte suggerimento che il browser è in modalità InPrivate.

Allo stesso modo, il sistema DRM di Adobe (usato da HBOGO, apparentemente) presenta un codice di errore quando il browser è InPrivate/Incognito, poiché non è possibile creare "artefatti della licenza" richiesti in modalità privata. https://forums.Adobe.com/thread/1189199

8
EricLaw

Vedo che c'è una generosità perché vuoi una risposta più precisa e aggiornata, ma la verità è che la risposta giusta è già stata data da altri. Posso solo darti qualche dettaglio in più, anche se non sono uno sviluppatore di JS e non ho mai saputo come funzionano queste cose.

La risposta breve è: usano JavaScript per implementare un tipo di euristica che controlla principalmente se alcune funzionalità sono disponibili o meno.

Dai un'occhiata a bostonglobe.com Per esempio. Fai clic su un articolo in modalità privata e vedrai l'avviso: "Sei in modalità privata, ecc.". Se disabiliti JavaScript, tale avviso non verrà visualizzato, il che significa che è stato eseguito in JS. Lo stesso vale se vai al New York Times, è solo JS. Ma come lo fanno esattamente? Su bostonglobe.com Ho trovato il codice in un file JS chiamato meter.js Nel sorgente. Se cerchi in quel codice detectPrivateMode vedrai la funzione che usa. È minimizzato, quindi è un dolore da leggere. La preimpostazione dell'origine negli strumenti di sviluppo del browser fornisce tuttavia il seguente codice:

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

Ad esempio, puoi vedere che stanno provando a usare window.webkitRequestFileSystem, In Firefox proveranno window.indexedDB.open('test'), in Safary window.openDatabase E così via. Tutte queste funzioni sembrano basarsi sul fatto che si comportano diversamente in modalità privata (modalità in incognito). La maggior parte del codice sembra utilizzare funzioni relative all'archiviazione locale, che apparentemente si comporta diversamente rispetto alla modalità normale. Esistono diversi blocchi try-catch, quindi la maggior parte di queste funzioni probabilmente non sono nemmeno disponibili in modalità privata. Se cerchi una di queste funzioni (magari aggiungendo anche "privato" o "in incognito" nella ricerca) troverai molti risultati che discutono i possibili modi per rilevare la modalità privata e alla fine il codice che troverai apparirà molto simile a quello che ho citato. Troverai diverse domande su StackExchange e anche frammenti di codice GitHub. Ad esempio, questa risposta su StackExchange contiene alcune informazioni interessanti: https://stackoverflow.com/a/4132218

Sul New York Times, se fai clic su un articolo, apri l'origine HTML e cerchi webkitRequestFileSystem, troverai un codice simile.

Come puoi vedere, potrebbero esserci alcune differenze nel codice e nell'euristica che usano, ma ogni sito Web sta probabilmente rilevando la modalità privata facendo affidamento sulla stessa piccola serie di funzioni.

6
reed

Apparentemente ci sono alcuni modi in cui i siti web possono rilevare quando ci si trova in modalità Navigazione privata, per Safari desktop e Safari mobile .

Desktop Safari non richiede favicon in modalità Navigazione privata, il che dà via le cose. Ha anche altre differenze .

Mobile Safari non supporta l'archiviazione locale HTML5 in modalità Navigazione privata, rilevabile anche dai siti Web.

3
D.W.

A partire da marzo 2020, sembra che sia ancora possibile per i siti rilevare se Firefox è in esecuzione in modalità privata, in base al fatto che IndexedDB non funziona quando Firefox è in esecuzione in modalità privata. Esistono numerosi media mainstream che sembrano utilizzare la tecnica per impedire agli utenti di navigare nel proprio sito in modalità privata o costringerli ad accedere.

GitHub Gist con codice di esempio:
https://Gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1

Demo funzionante del codice sopra:
https://output.jsbin.com/tazuwif

Discussioni Bugzilla con maggiori informazioni:
https://bugzilla.mozilla.org/show_bug.cgi?id=781982
https://bugzilla.mozilla.org/show_bug.cgi?id=150668

1
mti2935

La semplice risposta è no.

Il semplice rilevamento che la cronologia non viene salvata non significa che viene utilizzata la modalità di navigazione privata, significa semplicemente che la cronologia non viene salvata, qualcosa di facile da configurare in qualsiasi browser.

Perché accedere a un altro servizio significa che non si sta utilizzando la modalità di navigazione privata? Uso spesso Facebook in modalità di navigazione privata sui computer di altre persone, poiché ciò significa che non devo disconnetterli ed è un modo semplice per avere la mia sessione senza perdere il loro stato.

La modalità di navigazione privata abilita semplicemente le funzionalità che puoi configurare da solo in modalità normale. Abilita più funzionalità contemporaneamente per un periodo di tempo temporaneo per comodità. Non c'è modo di sapere se qualcuno sta usando la modalità di navigazione privata o se hanno semplicemente quelle funzionalità abilitate.

0
Sonny Ordell