คุณสามารถระบุได้ว่า Chrome อยู่ในโหมดไม่ระบุตัวตนผ่านสคริปต์หรือไม่


115

เป็นไปได้หรือไม่ที่จะตรวจสอบว่า Google Chrome อยู่ในโหมดไม่ระบุตัวตนผ่านสคริปต์หรือไม่

แก้ไข: ที่ จริงฉันหมายถึงมันเป็นไปได้ผ่านผู้ใช้สคริปต์ แต่คำตอบสมมติว่า JavaScript กำลังทำงานบนหน้าเว็บ ฉันถามคำถามนี้อีกครั้งเกี่ยวกับสคริปต์ผู้ใช้


29
มันจะไม่มากincognitoถ้าคุณสามารถตรวจสอบได้อย่างง่ายดาย :)
Aren

และคุณต้องจำไว้ว่าผู้ใช้ต้องอนุญาตโหมดไม่ระบุตัวตนสำหรับคู่มือส่วนขยาย โดยค่าเริ่มต้นทุกอย่างเป็นจริง
Mohamed Mansour

@ โมฮาเหม็ด: ผู้ใช้ที่ต้องยอมก็คงเป็นฉันดังนั้นมันจะไม่มีปัญหา :)
RodeoClown


1
@PeteAlvin หรือไซต์อาจลดคุณค่าโดยการตรวจจับไม่ระบุตัวตน ไซต์ของ Boston Globe จะไม่แสดงบทความในโหมดไม่ระบุตัวตนซึ่งป้องกันไม่ให้ผู้ใช้หลีกเลี่ยงโควต้าบทความฟรีของตน โดยทั่วไปแล้วฉันชอบให้ไซต์ที่รู้จักฉันน้อยกว่า
JohnC

คำตอบ:


232

จากคำตอบของ 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"));
    }


19
นี่เป็นวิธีที่ถูกแฮ็กน้อยที่สุดและควรอยู่ในอันดับต้น ๆ สะอาดและสง่างาม
Tom Teman

1
@ user2718671 jsfiddle.net/w49x9f1aยังใช้งานได้ดีสำหรับฉันใน Chrome ล่าสุดบน mac osx แปลก ...
Alok

1
ฉันลองที่ Chrome มันใช้งานได้ แต่ตรรกะถอยหลัง
Lucas Massuh

9
สิ่งนี้กำลังจะหายไปในไม่ช้าด้วยการกระทำเหล่านี้
blueren

9
ล้มเหลวใน chrome v 77.0.3865.90
Gitesh Purbia

18

วิธีหนึ่งคือไปที่ 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" อย่างไรก็ตามมันจะทำงานให้บริการจากเว็บเซิร์ฟเวอร์


เยี่ยมมากฉันไม่รู้ว่าโหมดไม่ระบุตัวตนไม่เน้นลิงก์ที่เยี่ยมชม สิ่งนี้ต้องการให้ผู้ใช้คลิกลิงก์
Igor Zevaka

1
ไม่เป็นเช่นนั้น iframe "คลิก" ลิงก์
kibibu

40
สิ่งนี้ใช้ไม่ได้จริงเนื่องจากเบราว์เซอร์ส่วนใหญ่ไม่เปิดเผย: ข้อมูลสไตล์ที่เข้าชมผ่านจาวาสคริปต์ อินเทอร์เฟซ CSS จะพูดราวกับว่าลิงก์มีสีที่ไม่ได้เข้าชม นี่เป็นมาตรการรักษาความปลอดภัยที่มีในเบราว์เซอร์ WebKit- และ Gecko อย่างน้อยตั้งแต่ปี 2010 เป็นต้นมาเพื่อปกป้องประวัติของผู้ใช้ (เช่นลองใช้ URL ที่เป็นไปได้ทั้งหมดและส่งไฟล์ที่เข้าชมไปยังบุคคลที่สามวิธีนี้จะได้รับ เข้าถึงโทเค็นใน URL และสิ่งที่ไม่)
Timo Tijhof

2
บทความทางการของ Mozilla ที่อธิบายการเปลี่ยนแปลงความเป็นส่วนตัวเกี่ยวกับ:visited: hacks.mozilla.org/2010/03/…
Denilson Sá Maia

18

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

5
นี่คือคำตอบที่ใช่ในตอนนี้ ควรอัปเดตคำตอบที่ยอมรับด้วยสิ่งนี้หรือคำตอบที่ยอมรับควรเปลี่ยนแปลง ไม่ควรหลีกเลี่ยงจากคำตอบที่ยอมรับในตอนแรกเนื่องจากเป็นคำตอบที่ถูกต้องในเวลานั้น
Cruncher

8

คุณสามารถใน JavaScript ดู JHurrah ของคำตอบ ยกเว้นการไม่ไฮไลต์ลิงก์โหมดไม่ระบุตัวตนทั้งหมดจะไม่บันทึกประวัติการเรียกดูและคุกกี้ จากหน้าความช่วยเหลือของ Google :

  • หน้าเว็บที่คุณเปิดและไฟล์ที่ดาวน์โหลดในขณะที่คุณไม่ระบุตัวตนจะไม่ถูกบันทึกไว้ในประวัติการเข้าชมและการดาวน์โหลดของคุณ
  • คุกกี้ใหม่ทั้งหมดจะถูกลบออกหลังจากที่คุณปิดหน้าต่างที่ไม่ระบุตัวตนทั้งหมดที่คุณเปิดไว้

ดังที่คุณเห็นความแตกต่างระหว่างการเรียกดูแบบปกติและแบบไม่ระบุตัวตนเกิดขึ้นหลังจากที่คุณเยี่ยมชมหน้าเว็บดังนั้นจึงไม่มีสิ่งใดที่เบราว์เซอร์สื่อสารไปยังเซิร์ฟเวอร์เมื่ออยู่ในโหมดนี้

คุณสามารถดูว่าเบราว์เซอร์ของคุณส่งไปยังเซิร์ฟเวอร์โดยใช้หนึ่งในหลายวิเคราะห์คำขอ HTTP เช่นนี้ที่นี่ เปรียบเทียบส่วนหัวระหว่างเซสชันปกติและไม่ระบุตัวตนแล้วคุณจะไม่เห็นความแตกต่าง


ล่าสุดได้ปิดการใช้งานส่วนขยายทั้งหมดยกเว้นส่วนขยายที่ผู้ใช้ทำเครื่องหมายโดยเฉพาะว่าปลอดภัยแบบไม่ระบุตัวตน
Tiberiu-Ionuț Stan

4

หากคุณกำลังพัฒนาส่วนขยายคุณสามารถใช้แท็บ API เพื่อตรวจสอบว่าหน้าต่าง / แท็บไม่ระบุตัวตนหรือไม่

ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่

หากคุณเพิ่งทำงานกับหน้าเว็บไม่ใช่เรื่องง่ายและได้รับการออกแบบมาให้เป็นแบบนั้น อย่างไรก็ตามฉันสังเกตเห็นว่าความพยายามทั้งหมดในการเปิดฐานข้อมูล (window.database) ล้มเหลวเมื่ออยู่ในโหมดไม่ระบุตัวตนนี่เป็นเพราะเมื่ออยู่ในโหมดไม่ระบุตัวตนจะไม่อนุญาตให้ทิ้งร่องรอยของข้อมูลไว้ในเครื่องผู้ใช้

ฉันยังไม่ได้ทดสอบ แต่สงสัยว่าการโทรไปที่ localStorage ทั้งหมดก็ล้มเหลวเช่นกัน


3

สิ่งนี้ใช้สัญญาว่าจะรอให้รหัสอะซิงโครนัสตั้งค่าสถานะดังนั้นเราจึงสามารถใช้พร้อมกันได้ในภายหลัง

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

สิ่งนี้ดูน่าสนใจมากและเป็นรูปแบบของ Javascript ที่ฉันไม่คุ้นเคยและดูเหมือนว่า Netbeans 8.2 IDE ของฉันไม่รองรับใน Windows 10 แต่ถ้าฉันสามารถทำให้มันใช้งานได้ฉันก็อยากรู้เช่นกัน: ฉันสามารถแทนที่reject('Check incognito failed')ด้วยresolve(false)ถ้าฉันต้องการisIncognitoเป็นบูลีนที่เป็นจริงหรือเท็จเท่านั้น? ขอบคุณ.
Ryan

2
ฉันเห็นSyntax Error: await is a reserved wordและฉันคิดว่าawaitต้องอยู่ในasyncฟังก์ชันเสมอ ดังนั้นฉันคิดว่ารหัสนี้ใช้ไม่ได้
Ryan

1
rejectจะเพิ่มข้อยกเว้นหากมีการเรียกใช้และจะไม่มีการส่งคืนค่าดังนั้นisIncognitoจะเป็นเช่นนั้นtrueหรือfalseวิธีการเขียนโค้ด อย่างไรก็ตามคุณยังสามารถใช้ "แก้ไข" ที่นั่นได้หากคุณต้องการให้ค่าส่งคืน และอาจขึ้นอยู่กับการจัดการสิ่งแวดล้อมที่รอคอยในขอบเขตทั่วโลก มันทำงานบนคอนโซลโครเมี่ยมในขอบเขตทั่วโลก แต่คุณสามารถลองรวมทุกอย่างเข้าด้วยกัน (async function() { 'everything here' })();เพื่อให้มันทำงานในฟังก์ชัน async
aljgom

2
หรือคุณสามารถบันทึกสัญญาที่จะisIncognitoแทนผลลัพธ์และเรียกใช้ในภายหลังในฟังก์ชัน async let isIncognito = new Promise( ...etcจากนั้นที่อื่นคุณจะมีฟังก์ชันเช่น(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom

1
คำตอบนี้ใช้ไม่ได้ใน chrome 76+
Cruncher

0

ฟังก์ชันคัดลอกวางอย่างรวดเร็วตามคำตอบของ 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') });

สิ่งนี้ไม่ทำงานอีกต่อไป (อาจใช้งานได้ในอดีต)
Alexandru R

2
เพิ่งอัปเดต Chrome ของฉันตอนนี้และยังใช้งานได้ ฉันเห็นคุณโพสต์ข้อความข้างต้นแล้วบอกว่าคุณเข้าใจผิดเพียงแค่ชี้ให้เห็นสิ่งนี้สำหรับผู้ชมในอนาคต (อย่าลังเลที่จะลบความคิดเห็นของคุณฉันจะลบความคิดเห็นนี้ถ้าคุณทำ)
aljgom

0

นี่คือคำตอบที่แนะนำซึ่งเขียนด้วยไวยากรณ์ 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)

0

นี่คือวิธีแก้ปัญหาโดยใช้คำสัญญา

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

-10

เอกสารสำหรับโหมดไม่ระบุตัวตนระบุไว้โดยเฉพาะว่าเว็บไซต์จะไม่ทำงานแตกต่างกัน ฉันเชื่อว่านี่หมายความว่าคำตอบคือไม่


9
ฉันรู้ว่าคำตอบนี้มีอายุ 4 ปีแล้ว แต่เมื่อเร็ว ๆ นี้ Netflix ได้ใช้ฟีเจอร์การตรวจจับ "ไม่ระบุตัวตน" และนั่นทำให้ฉันสนใจที่จะค้นคว้าว่าพวกเขาดึงมันออกมาได้อย่างไร หากคุณเข้าชม Netflix ในโหมดไม่ระบุตัวตน netflix ไม่อนุญาตให้คุณเล่นวิดีโอ
ILikeTacos

ยืนยัน <Chrome>: "ข้อผิดพลาดในโหมดไม่ระบุตัวตนเบราว์เซอร์ของคุณดูเหมือนจะอยู่ในโหมดไม่ระบุตัวตน"
Pete Alvin

ฉันคิดว่าโพสต์นี้สามารถปรับปรุงได้เพราะมันไม่ได้พูดถึงข้อเท็จจริงอย่างแน่นอน ตามที่ได้รับการพิสูจน์แล้วทั้งขึ้นและลงจากคำตอบนี้จะเห็นได้ว่ามีคนต้องการดูว่ามีการเยี่ยมชมจากโหมดไม่ระบุตัวตนหรือจากเบราว์เซอร์ Chrome ทั่วไปหรือไม่
FortuneSoldier

@ILikeTacos ฉันรู้ว่าความคิดเห็นของคุณ (มากกว่า) สี่ปี แต่ Chrome จงใจทำให้การตรวจจับไม่ระบุตัวตนของพวกเขาพังฉันจึงยังรู้สึกว่าฉันชนะในเรื่องนั้น ..
ลูกสุนัข

@Puppy อืมใช่ แต่จริงๆแล้วไม่มีmishravikas.com/articles/2019-07/…
Cruncher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.