Czy możesz określić, czy Chrome jest w trybie incognito, używając skryptu?

114

Czy można określić, czy przeglądarka Google Chrome jest w trybie incognito za pomocą skryptu?

Edycja: Właściwie miałem na myśli, czy jest to możliwe za pomocą skryptu użytkownika, ale odpowiedzi zakładają, że JavaScript działa na stronie internetowej. Ponownie zadałem tutaj pytanie w odniesieniu do skryptów użytkownika.

RodeoClown
źródło
28
Nie byłoby tak łatwo incognito, gdybyś mógł to łatwo określić :)
Aren
I musisz pamiętać, że użytkownik musi zezwolić na tryb incognito dla instrukcji rozszerzenia. Domyślnie wszystko jest prawdą.
Mohamed Mansour
@Mohamed: Użytkownik, który musiałby na to zezwolić, to ja, więc nie będzie problemu :)
RodeoClown
1
@PeteAlvin Lub witryna może obniżyć wartość, wykrywając incognito. Witryna Boston Globe nie będzie wyświetlać swoich artykułów w trybie incognito, co uniemożliwi użytkownikowi obejście bezpłatnego limitu artykułów. Ogólnie wolę, aby strona wiedziała o mnie mniej.
John C

Odpowiedzi:

232

Tak. Interfejs API FileSystem jest wyłączony w trybie incognito. Sprawdź https://jsfiddle.net/w49x9f1a/ gdy jesteś i nie jesteś w trybie incognito.

Przykładowy kod:

    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
źródło
19
To najmniej hakerski sposób i powinien znajdować się na górze. Czysty i elegancki.
Tom Teman
1
@ user2718671 jsfiddle.net/w49x9f1a nadal działa dobrze dla mnie w najnowszym Chrome na Mac OSX. dziwne ...
Alok
1
Próbowałem w Chrome. Działa, ale logika jest odwrotna.
Lucas Massuh
9
Dzięki tym zobowiązaniom to
wkrótce zniknie
8
niepowodzenie w przeglądarce Chrome w wersji 77.0.3865.90
Gitesh Purbia
18

Jednym ze sposobów jest odwiedzenie unikalnego adresu URL, a następnie sprawdzenie, czy link do tego adresu URL jest traktowany jako odwiedzany przez CSS.

Możesz zobaczyć przykład tego w „Wykrywaniu incognito” (link martwy) .

Artykuł badawczy tego samego autora, zastępujący powyższy link Wykrywanie incognito

W main.htmldodać iframe,

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

i trochę kodu 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 = '';
}

Następnie w test.htmltym są ładowane do 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> 

UWAGA: próba tego z poziomu systemu plików może sprawić, że Chrome zacznie płakać z powodu „niebezpiecznego kodu JavaScript”. Będzie jednak działał na serwerze internetowym.

JHurrah
źródło
To całkiem fajne, nie zdawałem sobie sprawy, że tryb incognito nie wyróżnia odwiedzanych linków. Wymaga to jednak od użytkownika kliknięcia łącza.
Igor Zevaka
1
Nie, nie, element iframe „klika” link.
kibibu
40
To w rzeczywistości nie działa, ponieważ większość przeglądarek nie ujawnia: odwiedzanych informacji o stylu za pomocą javascript. Interfejs CSS powie tak, jakby link miał nieodwiedzany kolor. Jest to środek bezpieczeństwa, który jest stosowany w przeglądarkach WebKit i Gecko co najmniej od 2010 roku. Miało to na celu ochronę historii użytkownika (np. Można było wypróbować wszystkie możliwe adresy URL i wysłać odwiedzane do osoby trzeciej. W ten sposób można było dostęp do tokenów w adresach URL, a co nie).
Timo Tijhof,
2
Oficjalny artykuł Mozilli wyjaśniający zmiany prywatności dotyczące :visited: hacks.mozilla.org/2010/03/…
Denilson Sá Maia
18

W Chrome 74+ możesz to ustalić, szacując dostępną przestrzeń dyskową systemu plików

Zobacz 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
źródło
4
To jest teraz właściwa odpowiedź. Albo zaakceptowana odpowiedź powinna zostać zaktualizowana o to, albo zaakceptowana odpowiedź powinna się zmienić. Nie odejmować od pierwotnie zaakceptowanej odpowiedzi, ponieważ w tamtym czasie było to poprawne rozwiązanie.
Cruncher
8

Możesz w JavaScript zobaczyć odpowiedź JHurraha . Z wyjątkiem nie podświetlania linków, cały tryb incognito nie zapisuje historii przeglądania ani plików cookie. Ze strony pomocy Google :

  • Strony internetowe, które otwierasz i pliki pobierane w trybie incognito, nie są zapisywane w historii przeglądania i pobierania.
  • Wszystkie nowe pliki cookie są usuwane po zamknięciu wszystkich otwartych okien incognito.

Jak widać, różnice między normalnym przeglądaniem a trybem incognito występują po odwiedzeniu strony internetowej, stąd przeglądarka nic nie komunikuje się z serwerem, gdy jest w tym trybie.

Możesz zobaczyć, co dokładnie Twoja przeglądarka wysyła do serwera za pomocą jednego z wielu analizatorów żądań HTTP, takiego jak ten tutaj . Porównaj nagłówki między normalną sesją a incognito, a nie zobaczysz żadnej różnicy.

Igor Zevaka
źródło
Ostatnio wyłącza wszystkie rozszerzenia oprócz tych, które zostały specjalnie oznaczone przez użytkownika jako bezpieczne incognito.
Tiberiu-Ionuț Stan
4

Jeśli tworzysz rozszerzenie, możesz użyć interfejsu API zakładek, aby określić, czy okno / karta jest incognito.

Więcej informacji można znaleźć tutaj .

Jeśli pracujesz tylko ze stroną internetową, nie jest to łatwe i tak zostało zaprojektowane. Zauważyłem jednak, że wszystkie próby otwarcia bazy danych (window.database) kończą się niepowodzeniem w trybie incongnito, ponieważ w trybie incognito nie można pozostawić śladu danych na komputerze użytkownika.

Nie testowałem tego, ale podejrzewam, że wszystkie wywołania localStorage również zawodzą.

Kinlan
źródło
3

Wykorzystuje to obietnicę oczekiwania, aż kod asynchroniczny ustawi flagę, więc możemy później używać go synchronicznie.

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

wtedy możemy zrobić

if(isIncognito) alert('in incognito');
else alert('not in incognito');
aljgom
źródło
Wygląda to bardzo ciekawy i jest formą JavaScript że jestem zaznajomiony z i wydaje nieobsługiwane przez mojego NetBeans IDE 8.2 w systemie Windows 10. Ale jeśli mogę zmusić go do pracy, jestem też ciekaw: czy mogę wymienić reject('Check incognito failed')ze resolve(false)jeśli chcę isIncognitobyć wartością logiczną, która jest zawsze prawdziwa lub fałszywa? Dzięki.
Ryan
2
Rozumiem Syntax Error: await is a reserved wordi myślę, że awaitzawsze musi być w ramach asyncfunkcji. Więc myślę, że ten kod nie działa.
Ryan
1
rejectwywołałby wyjątek, gdyby został wywołany, a wartość nie zostałaby zwrócona, a więc isIncognitozawsze tak będzie truelub falsesposób, w jaki kod jest napisany. Jednak możesz tam również użyć „rozwiązania”, jeśli chcesz zwrócić wartość. I może zależeć od tego, jak środowisko poradzi sobie w globalnym zakresie? Działa na konsoli Chrome w zakresie globalnym, ale możesz spróbować zawinąć wszystko, (async function() { 'everything here' })();aby był uruchamiany w funkcji asynchronicznej
aljgom
2
Alternatywnie możesz po prostu zapisać obietnicę isIncognitozamiast wyniku, a następnie uruchomić ją w funkcji asynchronicznej: let isIncognito = new Promise( ...etcwtedy gdzieś indziej miałbyś funkcję taką jak(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom
1
Ta odpowiedź jest unieważniona w Chrome 76+
Cruncher
0

Szybka funkcja kopiuj-wklej oparta na odpowiedzi Aloka (uwaga: jest to asynchroniczne)

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

stosowanie:

ifIncognito(true,  ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
aljgom
źródło
to już nie działa (może działało w przeszłości)
Alexandru R
2
Właśnie zaktualizowałem teraz mój chrome i nadal działa. Widzę, że opublikowałeś to samo powyżej, a następnie powiedziałeś, że się pomyliłeś, po prostu wskazując to przyszłym widzom (możesz usunąć swój komentarz, jeśli to zrobisz, usunę ten).
aljgom
0

Oto sugerowana odpowiedź napisana w składni ES6 i nieco poprawiona.

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
źródło
0

Tutaj rozwiązanie wykorzystujące obietnice

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

Jak z tego korzystać:

isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
Juan Ricardo
źródło
-10

Dokumentacja dotycząca trybu incognito mówi konkretnie, że strony internetowe nie będą się zachowywać inaczej. Uważam, że oznacza to, że odpowiedź brzmi: nie.

Szczeniak
źródło
9
Wiem, że ta odpowiedź ma 4 lata, ale ostatnio Netflix wdrożył funkcję wykrywania „incognito”, co wzbudziło moje zainteresowanie badaniem, w jaki sposób tego dokonują. Jeśli odwiedzasz Netflix w trybie incognito, Netflix nie pozwala na odtwarzanie filmów.
ILikeTacos,
Zweryfikowany <Chrome>: „Błąd trybu incognito Wygląda na to, że Twoja przeglądarka działa w trybie incognito”.
Pete Alvin
Myślę, że ten post można ulepszyć, ponieważ z pewnością nie mówi o faktach. Jak udowodniono już zarówno w górę, jak iw dół tej odpowiedzi, można zobaczyć, czy ktoś chciałby sprawdzić, czy jest odwiedzany w trybie incognito, czy ze zwykłej przeglądarki Chrome.
FortuneSoldier
@ILikeTacos Wiem, że Twój komentarz ma (ponad) cztery lata, ale Chrome celowo złamał ich wykrywanie incognito, więc nadal czuję, że wygrałem ...
Szczeniak
@ Puppy Cóż, tak. Ale właściwie nie ma mishravikas.com/articles/2019-07/…
Cruncher