เป็นไปได้หรือไม่ที่จะตรวจสอบว่า Google Chrome อยู่ในโหมดไม่ระบุตัวตนผ่านสคริปต์หรือไม่
แก้ไข: ที่ จริงฉันหมายถึงมันเป็นไปได้ผ่านผู้ใช้สคริปต์ แต่คำตอบสมมติว่า JavaScript กำลังทำงานบนหน้าเว็บ ฉันถามคำถามนี้อีกครั้งเกี่ยวกับสคริปต์ผู้ใช้
เป็นไปได้หรือไม่ที่จะตรวจสอบว่า Google Chrome อยู่ในโหมดไม่ระบุตัวตนผ่านสคริปต์หรือไม่
แก้ไข: ที่ จริงฉันหมายถึงมันเป็นไปได้ผ่านผู้ใช้สคริปต์ แต่คำตอบสมมติว่า JavaScript กำลังทำงานบนหน้าเว็บ ฉันถามคำถามนี้อีกครั้งเกี่ยวกับสคริปต์ผู้ใช้
คำตอบ:
จากคำตอบของ Vinnie Jamesและความคิดเห็นของ Amit :
async function in_incognito () {
if (!("storage" in navigator) || !("estimate" in navigator.storage)) return;
const {usage, quota} = await navigator.storage.estimate();
console.log("Incognito? ", quota < 120000000)
}
in_incognito();
* แก้ไข; สิ่งต่อไปนี้ใช้ไม่ได้ใน Chrome อีกต่อไป: *
ใช่. FileSystem API ถูกปิดใช้งานในโหมดไม่ระบุตัวตน ตรวจสอบhttps://jsfiddle.net/w49x9f1a/เมื่อคุณอยู่และไม่ได้อยู่ในโหมดไม่ระบุตัวตน
โค้ดตัวอย่าง:
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"));
}
วิธีหนึ่งคือไปที่ URL ที่ไม่ซ้ำกันจากนั้นตรวจสอบว่าลิงก์ไปยัง URL นั้นได้รับการปฏิบัติตามที่ CSS เยี่ยมชมหรือไม่
คุณสามารถดูตัวอย่างนี้ใน "การตรวจสอบไม่ระบุตัวตน" (ลิงค์ตาย)
เอกสารวิจัยโดยผู้เขียนคนเดียวกันเพื่อแทนที่การตรวจหาลิงก์ที่ไม่ระบุตัวตนด้านบน
ในการmain.html
เพิ่ม iframe
<iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
และโค้ด 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 = '';
}
จากนั้นtest.html
โหลดลงใน 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>
หมายเหตุ: การลองใช้สิ่งนี้จากระบบไฟล์อาจทำให้ Chrome ร้องไห้เกี่ยวกับ "Unsafe Javascript" อย่างไรก็ตามมันจะทำงานให้บริการจากเว็บเซิร์ฟเวอร์
:visited
: hacks.mozilla.org/2010/03/…
ใน Chrome 74+ คุณสามารถระบุได้โดยการประมาณพื้นที่จัดเก็บระบบไฟล์ที่มีอยู่
ดู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')
}
คุณสามารถใน JavaScript ดู JHurrah ของคำตอบ ยกเว้นการไม่ไฮไลต์ลิงก์โหมดไม่ระบุตัวตนทั้งหมดจะไม่บันทึกประวัติการเรียกดูและคุกกี้ จากหน้าความช่วยเหลือของ Google :
- หน้าเว็บที่คุณเปิดและไฟล์ที่ดาวน์โหลดในขณะที่คุณไม่ระบุตัวตนจะไม่ถูกบันทึกไว้ในประวัติการเข้าชมและการดาวน์โหลดของคุณ
- คุกกี้ใหม่ทั้งหมดจะถูกลบออกหลังจากที่คุณปิดหน้าต่างที่ไม่ระบุตัวตนทั้งหมดที่คุณเปิดไว้
ดังที่คุณเห็นความแตกต่างระหว่างการเรียกดูแบบปกติและแบบไม่ระบุตัวตนเกิดขึ้นหลังจากที่คุณเยี่ยมชมหน้าเว็บดังนั้นจึงไม่มีสิ่งใดที่เบราว์เซอร์สื่อสารไปยังเซิร์ฟเวอร์เมื่ออยู่ในโหมดนี้
คุณสามารถดูว่าเบราว์เซอร์ของคุณส่งไปยังเซิร์ฟเวอร์โดยใช้หนึ่งในหลายวิเคราะห์คำขอ HTTP เช่นนี้ที่นี่ เปรียบเทียบส่วนหัวระหว่างเซสชันปกติและไม่ระบุตัวตนแล้วคุณจะไม่เห็นความแตกต่าง
หากคุณกำลังพัฒนาส่วนขยายคุณสามารถใช้แท็บ API เพื่อตรวจสอบว่าหน้าต่าง / แท็บไม่ระบุตัวตนหรือไม่
ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่
หากคุณเพิ่งทำงานกับหน้าเว็บไม่ใช่เรื่องง่ายและได้รับการออกแบบมาให้เป็นแบบนั้น อย่างไรก็ตามฉันสังเกตเห็นว่าความพยายามทั้งหมดในการเปิดฐานข้อมูล (window.database) ล้มเหลวเมื่ออยู่ในโหมดไม่ระบุตัวตนนี่เป็นเพราะเมื่ออยู่ในโหมดไม่ระบุตัวตนจะไม่อนุญาตให้ทิ้งร่องรอยของข้อมูลไว้ในเครื่องผู้ใช้
ฉันยังไม่ได้ทดสอบ แต่สงสัยว่าการโทรไปที่ localStorage ทั้งหมดก็ล้มเหลวเช่นกัน
สิ่งนี้ใช้สัญญาว่าจะรอให้รหัสอะซิงโครนัสตั้งค่าสถานะดังนั้นเราจึงสามารถใช้พร้อมกันได้ในภายหลัง
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));
});
แล้วเราสามารถทำได้
if(isIncognito) alert('in incognito');
else alert('not in incognito');
reject('Check incognito failed')
ด้วยresolve(false)
ถ้าฉันต้องการisIncognito
เป็นบูลีนที่เป็นจริงหรือเท็จเท่านั้น? ขอบคุณ.
Syntax Error: await is a reserved word
และฉันคิดว่าawait
ต้องอยู่ในasync
ฟังก์ชันเสมอ ดังนั้นฉันคิดว่ารหัสนี้ใช้ไม่ได้
reject
จะเพิ่มข้อยกเว้นหากมีการเรียกใช้และจะไม่มีการส่งคืนค่าดังนั้นisIncognito
จะเป็นเช่นนั้นtrue
หรือfalse
วิธีการเขียนโค้ด อย่างไรก็ตามคุณยังสามารถใช้ "แก้ไข" ที่นั่นได้หากคุณต้องการให้ค่าส่งคืน และอาจขึ้นอยู่กับการจัดการสิ่งแวดล้อมที่รอคอยในขอบเขตทั่วโลก มันทำงานบนคอนโซลโครเมี่ยมในขอบเขตทั่วโลก แต่คุณสามารถลองรวมทุกอย่างเข้าด้วยกัน (async function() { 'everything here' })();
เพื่อให้มันทำงานในฟังก์ชัน async
isIncognito
แทนผลลัพธ์และเรียกใช้ในภายหลังในฟังก์ชัน async let isIncognito = new Promise( ...etc
จากนั้นที่อื่นคุณจะมีฟังก์ชันเช่น(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
ฟังก์ชันคัดลอกวางอย่างรวดเร็วตามคำตอบของ Alok (หมายเหตุ: เป็นแบบอะซิงโครนัส)
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, ()=>{});
}
}
การใช้งาน:
ifIncognito(true, ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
นี่คือคำตอบที่แนะนำซึ่งเขียนด้วยไวยากรณ์ ES6 และชัดเจนขึ้นเล็กน้อย
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)
นี่คือวิธีแก้ปัญหาโดยใช้คำสัญญา
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);
}
});
};
วิธีใช้:
isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
เอกสารสำหรับโหมดไม่ระบุตัวตนระบุไว้โดยเฉพาะว่าเว็บไซต์จะไม่ทำงานแตกต่างกัน ฉันเชื่อว่านี่หมายความว่าคำตอบคือไม่
incognito
ถ้าคุณสามารถตรวจสอบได้อย่างง่ายดาย :)