Bir komut dosyası aracılığıyla Chrome'un gizli modda olup olmadığını belirleyebilir misiniz?


114

Google Chrome'un gizli modda olup olmadığını bir komut dosyası aracılığıyla belirlemek mümkün mü?

Düzenleme: Aslında bunun kullanıcı komut dosyasıyla mümkün olduğunu söyledim, ancak cevaplar JavaScript'in bir web sayfasında çalıştığını varsayıyor. Kullanıcı komut dosyalarıyla ilgili olarak buradaki soruyu yeniden sordum .


28
incognitoKolayca belirleyebilseydiniz çok olmazdı :)
Aren

Ayrıca, kullanıcının uzantı kılavuzu için gizli moda izin vermesi gerektiğini unutmamalısınız. Varsayılan olarak her şey doğrudur.
Mohamed Mansour

@Mohamed: Buna izin vermek zorunda olan kullanıcı ben olurum, bu yüzden sorun olmaz :)
RodeoClown


1
@PeteAlvin Veya site, gizli modu algılayarak değeri azaltabilir. Boston Globe'un sitesi, makaleleri gizli olarak görüntülemeyecek ve kullanıcının ücretsiz makale kotasını aşmasını engelleyecektir. Genel olarak, hakkımda daha az bilgisi olan bir siteyi tercih ederim.
JohnC

Yanıtlar:


232

Evet. FileSystem API, gizli modda devre dışı bırakılır. Check out https://jsfiddle.net/w49x9f1a/ sen ve gizli modda değilken.

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


19
Bu en az hack-ish yoldur ve en üstte olmalıdır. Temiz ve zarif.
Tom Teman

1
@ user2718671 jsfiddle.net/w49x9f1a , mac osx'teki en son Chrome'da benim için hala iyi çalışıyor. garip ...
Alok

1
Chrome'da denedim. İşe yarıyor, ancak mantık geriye doğru.
Lucas Massuh

9
Bu taahhütler sayesinde bu yakında ortadan
kalkacak

8
fail in chrome v 77.0.3865.90
Gitesh Purbia

18

Bunun bir yolu, benzersiz bir URL'yi ziyaret etmek ve ardından bu URL'ye giden bir bağlantının CSS tarafından ziyaret edilmiş olarak değerlendirilip değerlendirilmediğini kontrol etmektir.

Bunun bir örneğini "Gizli Modu Algılama" (Ölü bağlantı) bölümünde görebilirsiniz .

Yukarıdaki Gizli Modları Algılanıyor bağlantısının yerini alacak aynı yazara ait araştırma makalesi

Gelen main.htmlbir iframe ekleyin

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

ve bazı JavaScript kodu:

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 = '';
}

Daha sonra test.htmliFrame'e yüklenir:

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

NOT: Bunu dosya sisteminden denemek Chrome'un "Güvenli Olmayan Javascript" konusunda ağlamasına neden olabilir. Bununla birlikte, bir web sunucusundan hizmet vermeye çalışacaktır.


Bu oldukça havalı, gizli modun ziyaret edilen bağlantıları vurgulamadığını fark etmemiştim. Bu, kullanıcının bir bağlantıya tıklamasını gerektirir.
Igor Zevaka

1
Hayır değil, iframe bağlantıyı "tıklar".
kibibu

40
Çoğu tarayıcı javascript aracılığıyla ziyaret edilen stil bilgilerini ifşa etmediğinden bu aslında çalışmaz. CSS arayüzü, bağlantının ziyaret edilmemiş renge sahip olduğunu söyleyecektir. Bu, WebKit ve Gecko tarayıcılarında en azından 2010'dan beri uygulanan bir güvenlik önlemidir. Bu, kullanıcının geçmişini korumak içindi (örneğin, bir kişi tüm olası URL'leri deneyebilir ve ziyaret edilenleri üçüncü bir tarafa gönderebilir. url'lerdeki belirteçlere erişim ve ne değil).
Timo Tijhof

2
Gizlilik açıklayan Resmi Mozilla makale ile ilgili değişiklikleri :visited: hacks.mozilla.org/2010/03/...
Denilson Sá'nın Maià

18

Chrome 74+ sürümünde , mevcut dosya sistemi depolama alanını tahmin ederek bunu belirleyebilirsiniz.

Jsfiddle'a bakın

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

4
Bu şimdi doğru cevap. Ya kabul edilen cevap bununla güncellenmeli ya da kabul edilen cevap değişmelidir. O zaman doğru çözüm olduğu için, başlangıçta kabul edilen cevaptan uzaklaşmamak.
Cruncher

8

JavaScript'te JHurrah'ın cevabına bakabilirsiniz . Bağlantıların vurgulanmaması dışında, tüm gizli mod, göz atma geçmişini ve çerezleri kaydetmez. Google yardım sayfasından :

  • Gizli moddayken açtığınız web sayfaları ve indirdiğiniz dosyalar tarama ve indirme geçmişlerinize kaydedilmez.
  • Açtığınız tüm gizli pencereleri kapattığınızda tüm yeni çerezler silinir.

Siz web sayfasını ziyaret ettikten sonra normal göz atma ile gizli mod arasındaki farkları görebileceğiniz gibi , bu nedenle tarayıcının bu moddayken sunucuya ilettiği hiçbir şey yoktur.

Burada olduğu gibi, birçok HTTP istek çözümleyicisinden birini kullanarak tarayıcınızın sunucuya tam olarak ne gönderdiğini görebilirsiniz . Normal oturum ve gizli mod arasındaki başlıkları karşılaştırın ve hiçbir fark görmeyeceksiniz.


Son zamanlarda, kullanıcı tarafından özel olarak gizli güvenli olarak işaretlenen uzantılar dışındaki tüm uzantıları devre dışı bırakır.
Tiberiu-Ionuț Stan

4

Bir Uzantı geliştiriyorsanız, bir pencere / sekmenin gizli olup olmadığını belirlemek için sekmeler API'sini kullanabilirsiniz.

Daha fazla bilgiyi burada bulabilirsiniz .

Yalnızca bir web sayfasıyla çalışıyorsanız, bu kolay değildir ve bu şekilde tasarlanmıştır. Ancak, bir veritabanını (window.database) açmaya yönelik tüm girişimlerin, gizli moddayken başarısız olduğunu fark ettim, bunun nedeni, gizli moddayken kullanıcıların makinesinde hiçbir veri izinin kalmasına izin verilmemesidir.

Test etmedim ama localStorage'a yapılan tüm çağrıların da başarısız olduğundan şüpheleniyorum.


3

Bu, eşzamansız kodun bir bayrak ayarlamasını beklemek için bir söz kullanır, böylece daha sonra onu eşzamanlı olarak kullanabiliriz.

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

o zaman yapabiliriz

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

Bu görünüm çok ilginç ve ben alışık olduğum ve Windows 10 benim NetBeans 8.2 IDE tarafından desteklenmeyen görünüyor Ama işe alabilirim eğer, ben de merak ediyorum o JavaScript şeklidir: Ben yerini alabilecek reject('Check incognito failed')ile resolve(false)İstersem isIncognitosadece her zaman doğru veya yanlış olan bir boole olmak için? Teşekkürler.
Ryan

2
Anlıyorum Syntax Error: await is a reserved wordve awaither zaman bir asyncişlevin içinde olması gerektiğini düşünüyorum . Bu yüzden bu kodun çalışmadığını düşünüyorum.
Ryan

1
rejectçağrılırsa bir istisna oluşturur ve bir değer döndürülmez, bu nedenle isIncognitoher zaman trueveya falsekodun yazıldığı şekilde olur. Ancak, bir değerin döndürülmesini istiyorsanız, orada bir 'çözümleme' de kullanabilirsiniz. Ve ortamın küresel kapsamda nasıl beklediğine bağlı olabilir mi? Genel kapsamda krom konsolda çalışır, ancak (async function() { 'everything here' })();eşzamansız bir işlevde çalışması için her şeyi içine
sarmayı deneyebilirsiniz

2
Alternatif olarak, sözünüzü isIncognitosonuç yerine kaydedebilir ve daha sonra eşzamansız bir işlevde çalıştırabilirsiniz: let isIncognito = new Promise( ...etco zaman başka bir yerde(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom

1
Bu cevap chrome 76+
Cruncher'da

0

Alok'un Cevabına dayalı hızlı kopyala-yapıştır işlevi (not: bu eşzamansızdır)

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

kullanımı:

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

bu artık çalışmıyor (belki geçmişte işe yaradı)
Alexandru R

2
Şimdi kromumu güncelledi ve hala çalışıyor. Yukarıda aynısını yayınladığınızı görüyorum ve sonra yanıldığınızı söylediniz, bunu gelecekteki izleyiciler için belirtmekten çekinmeyin (yorumunuzu silmekten çekinmeyin, eğer yaparsanız bunu silerim).
aljgom

0

İşte ES6 söz diziminde yazılmış ve biraz anlaşılır olan önerilen cevap.

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

İşte sözlerin kullanıldığı çözüm

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

Nasıl kullanılacağı:

isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))

-10

Gizli mod için belgeler özellikle web sitelerinin farklı davranmayacağını söylüyor. Bunun cevabın hayır olduğu anlamına geldiğine inanıyorum.


9
Bu cevabın 4 yaşında olduğunu biliyorum, ancak yakın zamanda Netflix özellikli "gizli" algılamayı uygulamaya koydu ve bu, bunu nasıl başardıklarını araştırmak için ilgimi çekti. Netflix'i gizli modda ziyaret ederseniz, netflix video oynatmanıza izin vermez.
ILikeTacos

Doğrulandı <Chrome>: "Gizli Mod Hatası Tarayıcınız Gizli Modda görünüyor."
Pete Alvin

Bu yazının geliştirilebileceğini düşünüyorum çünkü kesinlikle gerçeklerden bahsetmiyor. Bu yanıttan hem yukarı hem aşağı zaten kanıtlandığı gibi, birinin gizli moddan mı yoksa normal bir krom tarayıcıdan mı ziyaret edildiğini görmek isteyip istemediği görülebilir.
FortuneSoldier

@ILikeTacos Yorumunuzun (daha fazla) dört yaşında olduğunu biliyorum, ancak Chrome kasıtlı olarak gizli mod tespitini bozdu, bu yüzden hala bu konuda kazandığımı hissediyorum ..
Puppy

@Puppy Peki evet. Ama aslında mishravikas.com/articles/2019-07/…
Cruncher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.