it-swarm-eu.dev

Mohou webové stránky zjistit, zda používáte režim soukromého prohlížení?

Většina moderních prohlížečů podporuje " režim soukromého prohlížení " (také známý v Chrome jako "režim inkognito"), kde prohlížeč neuloží na disk o vašem prohlížení žádné informace. zatímco v tomto režimu.

Dokáže webový server v moderních prohlížečích zjistit, zda má uživatel, který web navštěvuje, povolen režim soukromého prohlížení?

Výzkum v pozadí, který jsem provedl Zde je to, co jsem dokázal najít v souvislosti s touto otázkou. Bohužel to na výše uvedenou otázku opravdu neodpovídá.

  • studie 201 režimu soukromého prohlížení ukázala, že je možné, aby weby detekovaly, zda je prohlížeč v režimu soukromého prohlížení, pomocí útoku čichání historie CSS. (V režimu soukromého prohlížení se weby do historie nepřidávají, takže můžete pomocí šňupání historie zkontrolovat, zda je návštěvník v režimu soukromého prohlížení.) Od té doby však moderní prohlížeče začleňovaly obrany - proti CSS historie čichající útoky.

    V důsledku toho bych neočekával, že tento způsob zjišťování, zda je prohlížeč v režimu soukromého prohlížení, bude nadále úspěšný. (Uvědomuji si, že obrana proti čichání historie je není dokonalá , ale pro tyto účely mohou být dost dobré.)

  • Může existovat způsoby pro web, který navštěvujete čit se , zda jste aktuálně přihlášeni na jiné weby (např. Facebook). Pokud je uživatel aktuálně přihlášen k jiným službám (jako je Facebook), mohla by webová stránka věrohodně hádat, že uživatel v současné době nepoužívá režim soukromého prohlížení - to není jistá věc, ale možná by se mohl pokusit určitá pravděpodobnost. Pokud však uživatel není přihlášen k jiným službám, pak můžeme jen říci, že nevíme, zda je používán režim soukromého prohlížení. Je možné, že by to mohlo přinést částečný únik informací, myslím, ale zní to v nejlepším případě nespolehlivé - pokud to dokonce funguje. Je také možné, že to nemusí fungovat vůbec.

Může tedy kdokoli poskytnout novější informace o tom, zda existuje způsob, jak web ověřit, zda jeho návštěvníci používají režim soukromého prohlížení?

64
D.W.

Nejsem si jistý, zda byste mohli spolehlivě detekovat soukromé prohlížení, ale myslím, že byste mohli použít nějakou heuristiku, abyste mohli udělat dobrý odhad, že uživatel je pomocí různých funkcí zvyšujících soukromí. Jak je uvedeno v mém komentáři k otázce, zda je to dostatečně dobré nebo vyhovuje vaší aplikaci, záleží na tom, co chcete být schopni udělat v reakci na detekci soukromého prohlížení. Jak zmínil Sonny Ordell, nejsem si jistý, zda můžete rozlišit soukromé prohlížení od ad hoc použití různých funkcí zvyšujících soukromí (např. Ruční mazání historie nebo souborů cookie).

Předpokládejme, že provozujete webovou aplikaci a chcete zjistit, kdy se jeden z vašich uživatelů (s účtem) přepne na soukromé prohlížení. Upřesňuji, že uživatel má účet, protože tato strategie závisí na sledování různých bitů údajů o chování. Aspekty soukromého prohlížení jsou (alespoň v Firefox ): historie, záznamy ve formuláři/vyhledávání, hesla, soubory ke stažení, soubory cookie, mezipaměť, úložiště DOM. Nejsem si jistý, jak testovat stahování, ale myslím, že ostatní mohou být vyzkoušeni. Pokud se u všech objeví pozitivní detekce, zdá se pravděpodobnější, že váš uživatel provádí soukromé prohlížení.

  • V triviálním případě sledujete (IP, user-agent) pro každého uživatele. Když obdržíte požadavek bez souborů cookie na odpovídající (IP, UA) záznam, můžete odvodit, že odpovídající uživatel je soukromé prohlížení. Tato metoda selže (bez detekce), pokud:

    1. Používá něco jako ProxySwitchy nebo TorButton k aktivaci Tor během soukromého prohlížení, čímž mění IP.
    2. Přepne do jiného prohlížeče (např. Obvykle používá FF a přepíná na Chrome pro anonymní režim).
    3. Přechod na soukromé prohlížení není okamžitý a jeho poskytovatel internetových služeb vydal novou IP adresu (např. V pátek byl 10.1.2.3, o víkendu nepoužíval vaši aplikaci a v pondělí 10.1.4.5).

    Jak je uvedeno v odpověď Sonnyho Ordella , pokud jiná osoba používá stejný prohlížeč v režimu soukromého prohlížení k přístupu na samostatný účet na vašem webu, dostanete detekci - ale je to trochu jiný případ, než kdyby „normální“ uživatel jednoduše přepne do režimu soukromého prohlížení.

    Falešně pozitivní dostanete, pokud uživatel jednoduše smaže své soubory cookie pro váš web nebo použije sekundární profil (např. Ponechám několik různých profilů Firefoxu s různými sadami pluginů pro určité testování a/nebo abych se vyhnul sledování, i když Myslím, že je to velmi neobvyklé).

  • Jako složitější kontrolu byste mohli použít něco jako panopticlick EFF a udržovat otisk prstu prohlížeče (nebo sbírku otisků prstů) namísto pouze UA pro každého uživatele. Toto selže v situaci 2 uvedené výše (např. Pokud uživatel používá výhradně identifikovatelné procházení pomocí FF a Chrome pro inkognito). Otisk prstu bude mnohem obecnější (a tedy mnohem méně užitečný), pokud uživatel má vypnutý javascript. Otisk prstu se změní , pokud uživatel selektivně povolí javascript v různých relacích (např. NoScript s dočasně povolenými weby).

  • Pravděpodobně budete moci porazit problém 1 (Tor) detekováním přístupu přes výstupní uzel Tor a jeho kombinací s otiskem prstu. Zdá se, že by to bylo užitečné pouze v úzkém okruhu případů.

  • Namísto pouze cookies pro výše uvedené kontroly otestujte localStorage. Pokud je to obvykle povoleno a klíč není v paměti pro tuto návštěvu a otisk prstu odpovídá, jedná se pravděpodobně o soukromé prohlížení. Pokud má uživatel běžně zakázané úložiště, pak jej samozřejmě nemůžete použít. Režimy selhání jsou podobné režimům popsaným výše pro soubory cookie.

  • Tento nápad jsem netestoval ani nerozvinul, ale myslím, že byste mohli hrát hry s Cache-Control. (Rychlé vyhledávání odhalí že to není originální nápad - tento projekt má, co vypadá jako kód konceptu.) Tato strategie selže, pokud uživatel jde prostřednictvím sdíleného serveru proxy pro ukládání do mezipaměti - mezitím se stránka zmiňuje anonymizer.com. Firefox alespoň nepoužívá mezipaměť v režimu soukromého prohlížení. (Viz tento web pro ukázku sledování založeného na mezipaměti.) Takže byste to mohli zkombinovat s výše uvedeným UA/otisky prstů: pokud váš měřič mezipaměti naznačuje, že se jedná o první návštěvu, můžete uhodnout, že uživatel je soukromé prohlížení. Toto selže s falešně pozitivní, pokud uživatel vyčistí mezipaměť; kombinujte s jinými technikami, abyste získali lepší odhad.

  • Pro každého uživatele byste mohli zjistit a sledovat, zda prohlížeč automaticky vyplňuje určitý prvek formuláře. Pokud zjistíte, že daný uživatel nezíská automatické vyplnění tohoto prvku formuláře, můžete odvodit soukromé prohlížení. To je křehké - možná uživatel nepoužívá svůj „primární“ počítač, ale pro spolehlivější odhad byste ho mohli kombinovat s otisky prstů, jak je uvedeno výše.

  • Útok s časováním na bočním kanálu: detekujte a sledujte typický čas, který je potřebný pro přihlášení každého uživatele k vaší aplikaci. Budou existovat variace, ale myslím, že byste mohli získat přesný odhad toho, zda někdo používá automatické vyplňování hesla. Pokud uživatel běžně používá automatické vyplňování heslem (tj. Rychlý přechod přes přihlašovací stránku) a poté pro danou návštěvu (s odpovídajícím otiskem prstu) nepoužívá automatické vyplňování, můžete odvodit soukromé prohlížení. Opět je to křehké; kombinujte s jinými technikami pro lepší odhad. Budete také chtít zjistit a opravit síťovou latenci při daném načtení stránky (např. Síť uživatele je možná jen pomalý v daný den a pomalý přechod přihlašovací stránky je pouze latence a nikoli nedostatek automatického vyplňování). Můžete být mírně zlí a automaticky se odhlásit (dát jim falešnou chybovou zprávu „zkuste to znovu“) a získat druhý datový bod, pokud jste ochotni svým uživatelům trochu obtěžovat.

  • Zkombinujte to s tím, co jste zmínili v otázce zjišťování, zda je uživatel přihlášen k jiným službám (např. Facebook), a můžete mít větší důvěru ve svůj odhad.

  • Pokud jste opravdu motivovaní, můžete hrát hry s DNS a měřit dobu načítání stránky. Rychlý test FF 3.6 a Chrome 15 Zdá se, že žádný prohlížeč nevymaže mezipaměť DNS v režimu soukromého prohlížení. A prohlížeč nemá absolutně žádnou kontrolu nad mezipamětí DNS místního systému. Pokud používáte při časování útoku DNS s postranním kanálem za účelem sledování uživatele jako alternativy (nebo vedle) otisku prstu, můžete získat spolehlivější odhad. Nejsem si jistý, jak spolehlivé bude sledování pomocí DNS načasování.

Detekce „anonymních“ uživatelů v režimu soukromého prohlížení bude mnohem těžší, protože jste neměli příležitost hromadit data o svém „typickém“ chování. A protože většina funkcí se zapne až po ukončení relace prohlížeče, opravdu nevíte, jestli se někdy vrátí.

Zde je nápad odhalit soukromé prohlížení anonymními uživateli, pokud jste ochotni být zlí, a měli jste nějaký zdroj, o kterém jste věděli, že je uživatel ochoten dát vašemu webu druhou šanci, a můžete vynutit uživatel pro aktivaci javascriptu. Sledujte otisk prstu, nastavte trvalý soubor cookie, localStorage, mezipaměť - cokoli můžete udělat pro sledování uživatele. Pokud se jedná o první návštěvu podle vašeho otisku prstu, havarujte/zavěste prohlížeč pomocí javascriptu (nebo flashu, nebo zlých triků, které znáte). Nasejte tuny paměti, nebo uvízněte ve smyčce, nebo cokoli, co to zabere, aby uživatel zavřel prohlížeč. Když se poté vrátí, uvidíte (z otisku prstu), že je to druhá návštěva. Pokud není nastaven soubor cookie/úložiště/mezipaměť/atd., Můžete odvodit, že první relací bylo soukromé procházení, a předpokládám, že byste mohli odvodit, že druhá relace je pravděpodobně také soukromé procházení. To zjevně selže, pokud se uživatel nevrátí, nebo pokud je nemůžete havarovat/přesvědčit, aby zabili okno prohlížeče. Jako bonus, pokud je odešlete na vlastní adresu URL a jsou v soukromém režimu a obnovíte relaci procházení, můžete uhodnout, že se nenacházejí v režimu soukromého prohlížení (pokud adresu URL neoznačili jako záložku).

Všechno nahoře je plné děr - dostatek prostoru pro falešné pozitivy nebo negativy. Pravděpodobně nikdy nevíte, jestli používám soukromé prohlížení, nebo pokud provozuji prohlížeč v VM bez trvalého úložiště. (Jaký je rozdíl?)

Nejhorší je, že pokud dostanete odpověď se spolehlivou metodou pro detekci soukromého prohlížení, je pravděpodobné, že zůstane životaschopná po velmi dlouhou dobu, prohlížeče jej buď "opraví", nebo uživatelé najdou řešení, aby se vyhnuli detekci.

30
bstpierre

Kontrola místního úložiště HTML 5 vám nyní umožňuje spolehlivě detekovat režim soukromého prohlížení (2019). Funguje tak, že se pokouší zapsat a poté přečíst „Místní úložiště“.

vidět:

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

nebo

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

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

Z výše uvedeného odkazu jherax:

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

Z výše uvedeného jLynxu

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

V obou příkladech znamená selhání otevření trvalého lokálního úložiště indexDB pro Firefox (definované HTML 5) soukromé prohlížení. Ostatní prohlížeče nazývají lokální úložiště pod různými jmény, například localStorage, jděte na obrázek.

10
user10216038

Můžete použít heuristiku, abyste se mohli spolehnout. Například v IE10 a IE11 (a Safari, IIRC) jsou vyvolány výjimky, když se pokoušíte použít IndexedDB jako silný náznak, že prohlížeč je v režimu InPrivate.

Podobně systém DRM společnosti Adobe (zřejmě používaný společností HBOGO) vydává chybový kód, když je prohlížeč v režimu InPrivate/Incognito, protože požadované „artefakty licence“ nelze v soukromém režimu vytvářet. https://forums.Adobe.com/thread/1189199

8
EricLaw

Vidím, že je tu odměna, protože chcete přesnější a aktuální odpověď, ale pravdou je, že správná odpověď již dali ostatní. Mohu vám jen poskytnout několik podrobností, i když nejsem vývojář JS a nikdy jsem nevěděl, jak tyto věci fungují.

Krátká odpověď zní: používají JavaScript k implementaci nějaké heuristiky, která hlavně kontroluje, zda je nějaká funkčnost dostupná nebo ne.

Podívejte se například na bostonglobe.com. V soukromém režimu klikněte na článek a zobrazí se upozornění: „Jste v soukromém režimu atd.“. Pokud JavaScript zakážete, toto oznámení se neobjeví, což znamená, že je provedeno v JS. Totéž platí, pokud jdete do New York Times, je to jen JS. Ale jak to přesně dělají? Dne bostonglobe.com Jsem ve zdroji našel kód v souboru JS s názvem meter.js. Pokud v tomto kódu vyhledáte detectPrivateMode, uvidíte funkci, kterou používá. Je to zkráceno, takže je to bolest číst. Předstírání zdroje v nástrojích dev prohlížeče však dává následující kód:

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

Můžete například vidět, že se snaží použít window.webkitRequestFileSystem, Ve Firefoxu zkusí window.indexedDB.open('test'), v Safary window.openDatabase Atd. Zdá se, že všechny tyto funkce spoléhají na skutečnost, že se v soukromém režimu chovají odlišně (režim inkognito). Zdá se, že většina kódu používá funkce související s místním úložištěm, které se zjevně chová jinak než v normálním režimu. Existuje několik bloků try-catch, takže většina z těchto funkcí pravděpodobně není ani dostupná v soukromém režimu. Pokud Google prohledáte některou z těchto funkcí (možná do vyhledávání přidáte také „soukromý“ nebo „inkognito“), najdete mnoho výsledků diskutujících o možných způsobech, jak zjistit soukromý režim, a nakonec kód, který najdete, bude vypadat velmi podobné tomu, který jsem citoval. Na StackExchange najdete několik otázek a také úryvky kódu GitHub. Například tato odpověď na StackExchange obsahuje některé zajímavé informace: https://stackoverflow.com/a/4132218

Pokud v New York Times kliknete na článek, otevřete zdroj HTML a hledáte webkitRequestFileSystem, najdete podobný kód.

Jak vidíte, mohou existovat určité rozdíly v kódu a heuristice, kterou používají, ale každý web pravděpodobně detekuje soukromý režim pomocí stejné malé sady funkcí.

6
reed

Je zřejmé, že existuje několik způsobů, jak mohou webové stránky detekovat, když jste v režimu soukromého prohlížení, pro Safari pro stolní počítače a mobilní Safari .

Desktop Safari nevyžaduje v režimu soukromého prohlížení favicon, což dává věci pryč. Má také jiné rozdíly .

Mobilní Safari nepodporuje místní úložiště HTML5, když je v režimu soukromého prohlížení, což je také detekovatelné webovými servery.

3
D.W.

Od března 2020 se zdá, že je stále možné, aby weby detekovaly, zda Firefox běží v soukromém režimu, na základě skutečnosti, že IndexedDB nefunguje, když Firefox běží v soukromém režimu. Zdá se, že existuje řada běžných mediálních výstupů, které podle všeho používají techniku, která blokuje uživatele v procházení jejich stránek v soukromém režimu nebo je nutí k přihlášení.

GitHub Gist s ukázkovým kódem:
https://Gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1

Pracovní ukázka výše uvedeného kódu:
https://output.jsbin.com/tazuwif

Vlákna Bugzilla s více informacemi:
https://bugzilla.mozilla.org/show_bug.cgi?id=781982
https://bugzilla.mozilla.org/show_bug.cgi?id=150668

1
mti2935

Jednoduchá odpověď zní ne.

Pouhé zjištění, že historie není uložena, neznamená, že je používán režim soukromého prohlížení, jednoduše to znamená, že historie není uložena, což lze snadno konfigurovat v libovolném prohlížeči.

Proč by bylo přihlášení do jiné služby znamenat, že nepoužíváte režim soukromého prohlížení? Často používám Facebook v režimu soukromého prohlížení na jiných počítačích lidí, protože to znamená, že se nemusím odhlásit a je to snadný způsob, jak mít svou vlastní relaci, aniž bych ztratil svůj stav.

Režim soukromého prohlížení jednoduše umožňuje funkce, které si můžete nakonfigurovat pro sebe v normálním režimu. To umožňuje několik funkcí najednou pro dočasné časové období pro pohodlí. Neexistuje způsob, jak zjistit, zda někdo používá režim soukromého prohlížení nebo že tyto funkce jednoduše povolil.

0
Sonny Ordell