簡體   English   中英

您可以通過腳本確定 Chrome 是否處於隱身模式嗎?

[英]Can you determine if Chrome is in incognito mode via a script?

是否可以通過腳本確定谷歌瀏覽器是否處於隱身模式?

編輯:我實際上是說是否可以通過用戶腳本,但答案假設 JavaScript 在 web 頁面上運行。 我在這里重新提出了有關用戶腳本的問題。

此答案的功能取決於 Chrome 版本。 最近的評論是這適用於v90

是的。 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")); }

在 Chrome 74 到 84.0.4147.135 中,您可以通過估計可用的文件系統存儲空間來確定這一點

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

一種方法是訪問唯一的 URL,然后檢查該 URL 的鏈接是否被 CSS 視為訪問過。

你可以在“Detecting Incognito” (死鏈接)中看到一個例子。

同一作者的研究論文替換上面的檢測隱身鏈接

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

然后在加載到 iFrame 的test.html中:

<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 抱怨“不安全的 Javascript”。 但是,它將從網絡服務器提供服務。

您可以在 JavaScript 中查看 JHurrah's answer 除了不突出顯示鏈接外,所有隱身模式都不會保存瀏覽歷史和 cookie。 從谷歌幫助頁面

  • 您在隱身時打開的網頁和下載的文件不會記錄在您的瀏覽和下載歷史記錄中。
  • 關閉所有已打開的隱身窗口后,所有新 cookie 都會被刪除。

正如您訪問網頁看到的正常瀏覽和隱身瀏覽之間的差異一樣,因此當瀏覽器處於這種模式時,瀏覽器不會與服務器進行任何通信。

您可以使用許多 HTTP 請求分析器之一查看瀏覽器向服務器發送的確切內容,就像這里的這個 比較普通會話和隱身會話之間的標題,您將看不到任何區別。

如果您正在開發擴展,那么您可以使用選項卡 API 來確定窗口/選項卡是否隱身。

可以在此處找到更多信息。

如果你只是在處理一個網頁,這並不容易,而且它就是這樣設計的。 但是,我注意到在隱身模式下打開數據庫(window.database)的所有嘗試都失敗了,這是因為在隱身模式下,不允許在用戶計算機上留下任何數據痕跡。

我還沒有測試過,但我懷疑所有對 localStorage 的調用也失敗了。

更新這似乎不再起作用了


這使用了一個 promise 來等待異步代碼設置一個標志,因此我們可以在之后同步使用它。

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

基於Alok's Answer 的快速功能(注意:這是異步的)

更新- 不再工作

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)

對於那些尋求解決方案的人,以下是截至 2021 年 10 月在各種瀏覽器中檢測隱私瀏覽模式的當前方法的簡要概述:

  • Chromium:類似於 Vinnie James 的回答,調用 navigator.storage.estimate(),獲取配額屬性並將其與 performance.memory.jsHeapSizeLimit 進行比較。 如果配額屬性小於 jsHeapSizeLimit,則為隱身。 如果未定義 jsHeapSizeLimit,請使用 1073741824 (1 GiB)。

  • 適用於 macOS 的 Safari:在不存在的推送服務器上使用 safari.pushNotification.requestPermission 並獲取錯誤。 如果“手勢”沒有出現在錯誤中,則它處於私密模式。

  • iOS 版 Safari:創建 iframe 並在 iframe 上使用 contentWindow.applicationCache 添加錯誤事件偵聽器。 如果錯誤跳閘,則處於私有模式。

  • Firefox:navigator.serviceWorker 將在私人窗口中未定義。

  • Internet Explorer:在 InPrivate 模式下,window.indexedDB 將是未定義的。

您可以在我在 GitHub 上提供的detectIncognito腳本中查看這些方法的實現。

其他答案在最近的 chrome 版本中似乎不再有效。

這個想法是找出存儲估計以確定選項卡是否隱身。 隱身標簽的存儲空間較小。

在正常和隱身模式下運行此代碼 window 並記下配額大小。

const {quota} = await navigator.storage.estimate();
console.log(quota);

使用配額大小差異來實現隱身模式檢測的邏輯。


以下邏輯適用於Chrome v105

const { quota } = await navigator.storage.estimate();

if (quota.toString().length === 10) {
  console.log("gotcha: this is incognito tab"); //quota = 1102885027
} else {
  console.log("this is a normal tab"); //quota = 296630877388
}

此外,查看此解決方案以獲得更廣泛的支持(也包括其他瀏覽器) detectIncognito.ts

演示: https://detetincognito.com/

是否可以通過腳本確定Google Chrome瀏覽器是否處於隱身模式?

編輯:我的意思是實際上可以通過用戶腳本來實現,但是答案假定JavaScript正在網頁上運行。 我在這里重新提出了有關用戶腳本的問題。

這在 2021 年 5 月有效: https : //jsfiddle.net/2b1dk8oa/

該腳本必須在網頁中執行,該網頁位於 iframe 中。

try{
    var ls = localStorage;
    alert("You are not in Incognito Mode.");
}
catch(e) {  alert("You are in Incognito Mode.");  }

是否可以通過腳本確定Google Chrome瀏覽器是否處於隱身模式?

編輯:我的意思是實際上可以通過用戶腳本來實現,但是答案假定JavaScript正在網頁上運行。 我在這里重新提出了有關用戶腳本的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM