Dapatkah Anda menentukan apakah Chrome dalam mode penyamaran melalui skrip?

114

Apakah mungkin untuk menentukan apakah Google Chrome dalam mode penyamaran melalui skrip?

Sunting: Maksud saya sebenarnya adalah mungkin melalui skrip pengguna, tetapi jawaban mengasumsikan JavaScript berjalan di halaman web. Saya telah mengajukan kembali pertanyaan di sini sehubungan dengan skrip pengguna.

RodeoClown
sumber
28
Tidak akan terlalu bagus incognitojika Anda bisa menentukannya dengan mudah :)
Aren
Dan Anda harus ingat bahwa pengguna harus mengizinkan mode penyamaran untuk manual ekstensi. Secara default, semuanya benar.
Mohamed Mansour
@Mohamed: Pengguna yang harus mengizinkannya adalah saya, jadi itu tidak akan menjadi masalah :)
RodeoClown
1
@PeteAlvin Atau situs dapat mengurangi nilai dengan mendeteksi penyamaran. Situs Boston Globe tidak akan menampilkan artikelnya dalam mode penyamaran, sehingga mencegah pengguna menghindari kuota artikel gratis mereka. Secara umum, saya lebih suka situs yang kurang tahu tentang saya.
JohnC

Jawaban:

232

Iya. API FileSystem dinonaktifkan dalam mode penyamaran. Lihat https://jsfiddle.net/w49x9f1a/ saat Anda berada dan tidak dalam mode penyamaran.

Kode sampel:

    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
sumber
19
Ini adalah cara hack-ish paling sedikit dan harus di atas. Bersih dan elegan.
Tom Teman
1
@ user2718671 jsfiddle.net/w49x9f1a masih berfungsi dengan baik untuk saya di Chrome terbaru di mac osx. aneh ...
Alok
1
Saya mencoba di Chrome. Itu berhasil, tetapi logikanya terbalik.
Lucas Massuh
9
Ini akan segera hilang berkat komitmen ini
blueren
8
gagal di chrome v 77.0.3865.90
Gitesh Purbia
18

Salah satu caranya adalah dengan mengunjungi URL unik dan kemudian memeriksa untuk melihat apakah tautan ke URL itu diperlakukan sebagai dikunjungi oleh CSS.

Anda dapat melihat contohnya di "Detecting Incognito" (Dead link) .

Makalah penelitian oleh penulis yang sama untuk menggantikan link Detecting Incognito di atas

Di main.htmltambahkan iframe,

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

, dan beberapa kode 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 = '';
}

Kemudian di test.html-load ke 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> 

CATATAN: mencoba ini dari sistem file dapat membuat Chrome menangis tentang "Javascript Tidak Aman". Namun, ini akan berfungsi melayani dari server web.

JHurrah
sumber
Itu cukup keren, saya tidak menyadari bahwa mode penyamaran tidak menyorot tautan yang dikunjungi. Ini mengharuskan pengguna untuk mengklik link.
Igor Zevaka
1
Tidak, iframe "mengklik" link tersebut.
kibibu
40
Ini sebenarnya tidak berfungsi karena sebagian besar browser tidak mengekspos: informasi gaya yang dikunjungi melalui javascript. Antarmuka CSS akan mengatakan seolah-olah tautan memiliki warna yang tidak dikunjungi. Ini adalah tindakan keamanan yang telah ada di browser WebKit- dan Gecko setidaknya sejak 2010. Ini untuk melindungi riwayat pengguna (misalnya, seseorang dapat mencoba semua URL yang mungkin, dan mengirim yang dikunjungi ke pihak ketiga. Dengan cara ini seseorang bisa mendapatkannya akses ke token di url dan apa yang tidak).
Timo Tijhof
2
Artikel resmi Mozilla menjelaskan perubahan privasi terkait :visited: hacks.mozilla.org/2010/03/…
Denilson Sá Maia
18

Di Chrome 74+, Anda dapat menentukan ini dengan memperkirakan ruang penyimpanan sistem file yang tersedia

Lihat 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
sumber
4
Inilah jawaban yang benar sekarang. Jawaban yang diterima harus diperbarui dengan ini, atau jawaban yang diterima harus berubah. Tidak mengambil dari jawaban yang diterima semula karena itu adalah solusi yang benar pada saat itu.
Cruncher
8

Anda dapat, dalam JavaScript, melihat jawaban JHurrah . Kecuali untuk tidak menyorot tautan, semua mode penyamaran tidak menyimpan riwayat penelusuran dan cookie. Dari halaman bantuan google :

  • Halaman web yang Anda buka dan file yang diunduh saat menggunakan mode penyamaran tidak direkam dalam riwayat penjelajahan dan unduhan Anda.
  • Semua cookie baru dihapus setelah Anda menutup semua jendela penyamaran yang Anda buka.

Seperti yang Anda lihat perbedaan antara penjelajahan normal dan penyamaran terjadi setelah Anda mengunjungi halaman web, maka tidak ada yang dikomunikasikan browser ke server saat berada dalam mode ini.

Anda dapat melihat apa yang sebenarnya dikirimkan browser Anda ke server menggunakan salah satu dari banyak penganalisis permintaan HTTP, seperti ini di sini . Bandingkan tajuk antara sesi normal dan penyamaran dan Anda tidak akan melihat perbedaan.

Igor Zevaka
sumber
Baru-baru ini, ini menonaktifkan semua ekstensi kecuali ekstensi yang secara khusus ditandai oleh pengguna sebagai penyamaran aman.
Stan Tiberiu-Ionuț
4

Jika Anda sedang mengembangkan Ekstensi, Anda dapat menggunakan API tab untuk menentukan apakah jendela / tab itu penyamaran.

Informasi lebih lanjut dapat ditemukan di sini .

Jika Anda hanya bekerja dengan halaman web, itu tidak mudah, dan dirancang seperti itu. Namun, saya perhatikan bahwa semua upaya untuk membuka database (window.database) gagal saat berada dalam mode penyamaran, hal ini karena saat dalam penyamaran tidak ada jejak data yang dibiarkan tertinggal di mesin pengguna.

Saya belum mengujinya tetapi saya curiga semua panggilan ke localStorage gagal juga.

Kinlan
sumber
3

Ini menggunakan janji untuk menunggu kode asinkron menyetel bendera, jadi kita bisa menggunakannya secara sinkron sesudahnya.

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

maka kita bisa melakukannya

if(isIncognito) alert('in incognito');
else alert('not in incognito');
aljgom
sumber
Ini terlihat sangat menarik dan merupakan bentuk Javascript yang tidak saya kenal dan sepertinya tidak didukung oleh Netbeans 8.2 IDE saya di Windows 10. Tetapi jika saya dapat membuatnya berfungsi, saya juga penasaran: dapatkah saya mengganti reject('Check incognito failed')dengan resolve(false)jika saya mau isIncognitomenjadi boolean yang hanya benar atau salah? Terima kasih.
Ryan
2
Begitu Syntax Error: await is a reserved word, dan saya pikir awaitselalu perlu berada dalam suatu asyncfungsi. Jadi saya pikir kode ini tidak berfungsi.
Ryan
1
rejectakan memunculkan eksepsi jika dipanggil, dan nilai tidak akan dikembalikan, jadi isIncognitoakan selalu trueatau falsecara kode ditulis. Namun, Anda juga dapat menggunakan 'penyelesaian' di sana jika Anda ingin nilai dikembalikan. Dan itu mungkin tergantung pada bagaimana menangani lingkungan menunggu dalam lingkup global? Ini berfungsi pada konsol chrome dalam lingkup global, tetapi Anda dapat mencoba menggabungkan semuanya (async function() { 'everything here' })();sehingga dijalankan di dalam fungsi asinkron
aljgom
2
Alternatifnya, Anda bisa menyimpan janji isIncognitoalih-alih hasilnya, dan menjalankannya setelah itu dalam fungsi asinkron: let isIncognito = new Promise( ...etclalu di tempat lain Anda akan memiliki fungsi seperti(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom
1
Jawaban ini tidak valid di chrome 76+
Cruncher
0

Fungsi salin-tempel cepat berdasarkan Jawaban Alok (catatan: ini asinkron)

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

pemakaian:

ifIncognito(true,  ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
aljgom
sumber
ini tidak berfungsi lagi (mungkin berhasil di masa lalu)
Alexandru R
2
Baru saja memperbarui chrome saya sekarang dan masih berfungsi. Saya melihat Anda memposting hal yang sama di atas dan kemudian mengatakan Anda salah, hanya menunjukkan ini untuk pemirsa di masa mendatang (jangan ragu untuk menghapus komentar Anda, saya akan menghapus yang ini jika Anda melakukannya).
aljgom
0

Berikut adalah jawaban yang disarankan yang ditulis dalam sintaks ES6 dan sedikit jelas.

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

Di sini solusinya menggunakan janji

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

Cara menggunakannya:

isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
Juan Ricardo
sumber
-10

Dokumentasi untuk mode penyamaran secara khusus mengatakan bahwa situs web tidak akan berperilaku berbeda. Saya yakin ini berarti jawabannya tidak.

Anak anjing
sumber
9
Saya tahu jawaban ini berumur 4 tahun, tetapi baru-baru ini Netflix menerapkan fitur deteksi "penyamaran", dan itu membuat saya tertarik untuk meneliti bagaimana mereka melakukannya. Jika Anda mengunjungi Netflix dengan mode penyamaran, Netflix tidak mengizinkan Anda memutar video.
ILikeTacos
<Chrome> Terverifikasi: "Kesalahan Mode Penyamaran Browser Anda tampaknya dalam Mode Penyamaran."
Pete Alvin
Saya pikir posting ini bisa diperbaiki karena jelas tidak berbicara fakta. Karena terbukti naik dan turun dari jawaban ini, dapat dilihat apakah seseorang ingin melihat apakah mereka dikunjungi dari mode penyamaran atau dari browser chrome biasa.
FortuneSoldier
@ILikeTacos Saya tahu komentar Anda (lebih dari) empat tahun, tapi Chrome sengaja merusak deteksi penyamaran mereka, jadi saya masih merasa saya menang untuk yang satu itu ..
Puppy
@Puppy Yah ya. Tapi sebenarnya tidak ada mishravikas.com/articles/2019-07/…
Cruncher