Bạn có thể xác định xem Chrome có đang ở chế độ ẩn danh hay không thông qua tập lệnh?


114

Có thể xác định xem Google Chrome có ở chế độ ẩn danh hay không thông qua tập lệnh?

Chỉnh sửa: Ý tôi thực sự là có thể thực hiện được thông qua tập lệnh người dùng, nhưng các câu trả lời giả sử JavaScript đang chạy trên một trang web. Tôi đã hỏi lại câu hỏi ở đây liên quan đến tập lệnh của người dùng.


28
Sẽ không khó incognitonếu bạn có thể xác định nó một cách dễ dàng :)
Aren

Và bạn phải nhớ rằng người dùng phải cho phép chế độ ẩn danh cho hướng dẫn sử dụng tiện ích mở rộng. Theo mặc định, mọi thứ đều đúng.
Mohamed Mansour

@Mohamed: Người dùng phải cho phép sẽ là tôi, vì vậy điều đó sẽ không thành vấn đề :)
RodeoClown


1
@PeteAlvin Hoặc trang web có thể giảm giá trị bằng cách phát hiện chế độ ẩn danh. Trang web của Boston Globe sẽ không hiển thị các bài viết của mình ở chế độ ẩn danh, ngăn người dùng vượt qua hạn ngạch các bài báo miễn phí của họ. Nói chung, tôi thích một trang web ít biết về tôi hơn.
JohnC

Câu trả lời:


232

Đúng. API FileSystem bị tắt ở chế độ ẩn danh. Kiểm tra https://jsfiddle.net/w49x9f1a/ khi bạn ở và không ở chế độ ẩn danh.

Mã mẫu:

    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
Đây là cách ít hack nhất và nên đứng đầu. Sạch sẽ và thanh lịch.
Tom Teman

1
@ user2718671 jsfiddle.net/w49x9f1a vẫn hoạt động tốt đối với tôi trong Chrome mới nhất trên mac osx. kỳ lạ ...
Alok

1
Tôi đã thử ở Chrome. Nó hoạt động, nhưng logic thì ngược lại.
Lucas Massuh

9
Điều này sẽ sớm biến mất nhờ những cam kết này
blueren 16/02/19

7
thất bại trong chrome v 77.0.3865.90
Gitesh Purbia

18

Một cách là truy cập vào một URL duy nhất và sau đó kiểm tra xem liệu một liên kết đến URL đó có được CSS truy cập hay không.

Bạn có thể xem ví dụ về điều này trong "Phát hiện ẩn danh" (Liên kết chết) .

Bài nghiên cứu của cùng một tác giả để thay thế liên kết Phát hiện ẩn danh ở trên

Trong main.htmlthêm một iframe,

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

và một số mã 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 = '';
}

Sau đó, trong test.htmlđó được tải vào 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> 

LƯU Ý: việc thử điều này từ hệ thống tệp có thể khiến Chrome kêu lên về "Javascript không an toàn". Tuy nhiên, nó sẽ hoạt động phục vụ từ một máy chủ web.


Điều đó khá tuyệt, tôi không nhận ra rằng chế độ ẩn danh không đánh dấu các liên kết đã truy cập. Điều này yêu cầu người dùng nhấp vào liên kết.
Igor Zevaka

1
Không, không, iframe "nhấp vào" liên kết.
kibibu

40
Điều này thực sự không hoạt động vì hầu hết các trình duyệt không hiển thị: thông tin kiểu đã truy cập thông qua javascript. Giao diện CSS sẽ hiển thị như thể liên kết có màu không được truy cập. Đây là biện pháp bảo mật đã có trong trình duyệt WebKit- và Gecko ít nhất là từ năm 2010. Biện pháp này nhằm bảo vệ lịch sử của người dùng (ví dụ: người ta có thể thử tất cả các URL có thể có và gửi những URL đã truy cập cho bên thứ ba. Bằng cách này, người ta có thể nhận được truy cập vào mã thông báo trong url và những gì không).
Timo Tijhof

2
Bài báo chính thức của Mozilla giải thích những thay đổi về quyền riêng tư liên quan đến :visited: hacks.mozilla.org/2010/03/…
Denilson Sá Maia

18

Trong Chrome 74+, bạn có thể xác định điều này bằng cách ước tính dung lượng lưu trữ hệ thống tệp khả dụng

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

4
Đây là câu trả lời đúng bây giờ. Câu trả lời được chấp nhận phải được cập nhật với điều này, hoặc câu trả lời được chấp nhận sẽ thay đổi. Không bỏ xa câu trả lời được chấp nhận ban đầu vì nó là giải pháp chính xác vào thời điểm đó.
Cruncher

8

Bạn có thể, trong JavaScript, xem câu trả lời của JHurrah . Ngoại trừ việc không đánh dấu các liên kết, tất cả chế độ ẩn danh không lưu lịch sử duyệt web và cookie. Từ trang trợ giúp của google :

  • Các trang web bạn mở và các tệp được tải xuống khi bạn ở chế độ ẩn danh sẽ không được ghi lại trong lịch sử duyệt và tải xuống của bạn.
  • Tất cả cookie mới sẽ bị xóa sau khi bạn đóng tất cả các cửa sổ ẩn danh mà bạn đã mở.

Như bạn có thể thấy sự khác biệt giữa duyệt thông thường và ẩn danh xảy ra sau khi bạn truy cập trang web, do đó, trình duyệt sẽ không giao tiếp gì với máy chủ khi ở chế độ này.

Bạn có thể xem chính xác những gì trình duyệt của bạn gửi đến máy chủ bằng cách sử dụng một trong nhiều trình phân tích yêu cầu HTTP, như trình này ở đây . So sánh các tiêu đề giữa phiên bình thường và ẩn danh và bạn sẽ không thấy sự khác biệt.


Gần đây, nó vô hiệu hóa tất cả các tiện ích mở rộng ngoại trừ những tiện ích mở rộng đã được người dùng đánh dấu cụ thể là an toàn ẩn danh.
Tiberiu-Ionuț Stan

4

Nếu bạn đang phát triển một Tiện ích mở rộng thì bạn có thể sử dụng API tab để xác định xem cửa sổ / tab có ẩn danh hay không.

Thông tin thêm có thể được tìm thấy ở đây .

Nếu bạn chỉ đang làm việc với một trang web, nó không phải là dễ dàng, và nó được thiết kế theo cách đó. Tuy nhiên, tôi nhận thấy rằng mọi nỗ lực mở cơ sở dữ liệu (window.database) đều thất bại khi ở chế độ ẩn danh, điều này là do khi ở chế độ ẩn danh, không có dấu vết dữ liệu nào được phép để lại trên máy người dùng.

Tôi chưa thử nghiệm nó nhưng tôi nghi ngờ rằng tất cả các lệnh gọi đến localStorage cũng không thành công.


3

Điều này sử dụng một lời hứa để đợi mã không đồng bộ đặt cờ, vì vậy chúng tôi có thể sử dụng nó một cách đồng bộ sau đó.

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

sau đó chúng ta có thể làm

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

Điều này trông rất thú vị và là một dạng Javascript mà tôi không quen và có vẻ như không được hỗ trợ bởi Netbeans 8.2 IDE của tôi trong Windows 10. Nhưng nếu tôi có thể làm cho nó hoạt động, tôi cũng tò mò: tôi có thể thay thế reject('Check incognito failed')bằng resolve(false)nếu tôi muốn isIncognitotrở thành boolean chỉ đúng hay sai? Cảm ơn.
Ryan

2
Tôi hiểu Syntax Error: await is a reserved word, và tôi nghĩ rằng awaitluôn cần phải ở trong một asyncchức năng. Vì vậy, tôi nghĩ rằng mã này không hoạt động.
Ryan

1
rejectsẽ đưa ra một ngoại lệ nếu nó được gọi, và một giá trị sẽ không được trả về, như vậy isIncognitosẽ luôn như vậy truehoặc falsecách mã được viết. Tuy nhiên, bạn cũng có thể sử dụng 'giải pháp' ở đó nếu bạn muốn một giá trị được trả về. Và nó có thể phụ thuộc vào cách xử lý môi trường đang chờ đợi trong phạm vi toàn cầu? Nó hoạt động trên chrome console trong phạm vi toàn cầu, nhưng bạn có thể thử gói tất cả mọi thứ trong (async function() { 'everything here' })();vì vậy nó được chạy bên trong một chức năng async
aljgom

2
Ngoài ra, bạn có thể chỉ tiết kiệm lời hứa isIncognitothay vì kết quả, và chạy nó sau đó trong một chức năng async: let isIncognito = new Promise( ...etcsau đó ở một nơi khác bạn muốn có một chức năng như(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom

1
Câu trả lời này là vô hiệu trong chrome 76+
Siêu Đẳng

0

Chức năng sao chép-dán nhanh dựa trên Câu trả lời của Alok (lưu ý: tính năng này không đồng bộ)

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

sử dụng:

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

điều này không hoạt động nữa (có thể nó đã hoạt động trong quá khứ)
Alexandru R

2
Vừa mới cập nhật chrome của tôi bây giờ và nó vẫn hoạt động. Tôi thấy bạn đăng tương tự ở trên và sau đó nói bạn đã nhầm lẫn, chỉ ra điều này cho những người xem sau (vui lòng xóa bình luận của bạn, tôi sẽ xóa bình luận này nếu bạn làm).
aljgom

0

Đây là câu trả lời gợi ý được viết bằng văn bản cú pháp ES6 và hơi rõ ràng.

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

Đây là giải pháp sử dụng các lời hứa

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

Cách sử dụng nó:

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

-10

Tài liệu về chế độ ẩn danh cho biết cụ thể rằng các trang web sẽ không hoạt động khác nhau. Tôi tin rằng điều này có nghĩa là câu trả lời là không.


9
Tôi biết câu trả lời này đã có từ 4 năm trước, nhưng gần đây Netflix đã triển khai tính năng phát hiện "ẩn danh" và điều đó thúc đẩy tôi quan tâm đến việc nghiên cứu cách họ thực hiện điều đó. Nếu bạn truy cập Netflix ở chế độ ẩn danh, netflix không cho phép bạn phát video.
ILikeTacos

<Chrome> đã xác minh: "Lỗi Chế độ Ẩn danh Trình duyệt của bạn dường như đang ở Chế độ Ẩn danh."
Pete Alvin

Tôi nghĩ rằng bài đăng này có thể được cải thiện bởi vì nó chắc chắn không nói về sự thật. Vì nó đã được chứng minh cả lên và xuống từ câu trả lời này, có thể thấy ai đó muốn xem liệu họ có được truy cập từ chế độ ẩn danh hay từ trình duyệt chrome thông thường hay không.
FortuneSoldier

@ILikeTacos tôi biết nhận xét của bạn là (hơn) bốn tuổi, nhưng Chrome cố ý phá vỡ phát hiện ẩn danh của họ, vì vậy tôi vẫn cảm thấy tôi thắng trên một mà ..
Puppy

@Puppy Vâng vâng. Nhưng thực ra không có mishravikas.com/articles/2019-07/…
Cruncher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.