您可以通过脚本确定Chrome是否处于隐身模式吗?


114

是否可以通过脚本确定Google Chrome浏览器是否处于隐身模式?

编辑: 我的意思是实际上可以通过用户脚本来实现,但是答案假定JavaScript正在网页上运行。我在这里重新提出了有关用户脚本的问题。


28
incognito如果您可以轻松确定它不是很好:)
Aren

并且您必须记住,用户必须为扩展手册允许隐身模式。默认情况下,所有情况都是正确的。
穆罕默德·曼苏尔

@Mohamed:必须允许的用户是我,这样就不会有问题了:)
RodeoClown 2010年


1
@PeteAlvin否则,该站点可能会通过检测隐身身份而降低价值。波士顿环球报的网站不会以隐身方式显示其文章,从而阻止用户绕过他们的免费文章配额。一般而言,我更喜欢一个对我了解较少的网站。
JohnC

Answers:


232

是。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
这是最不容易破解的方法,应该放在首位。干净优雅。
汤姆·特曼

1
@ user2718671 jsfiddle.net/w49x9f1a在Mac osx上的最新Chrome中仍然可以正常工作。很奇怪...
Alok

1
我尝试过Chrome。它可以工作,但是逻辑是倒退的。
卢卡斯·马苏

9
由于这些承诺,将很快消失
blueren

7
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发出“不安全的Javascript”之声。但是,它将通过Web服务器提供服务。


太酷了,我没有意识到隐身模式不会突出显示访问过的链接。但这需要用户单击链接。
伊戈尔·泽瓦卡

1
不,不是这样,iframe会“点击”链接。
kibibu 2010年

40
这实际上不起作用,因为大多数浏览器都不通过javascript公开:visited样式信息。CSS界面将显示该链接是否具有未访问的颜色。至少从2010年开始,这是一种安全措施,至少已在WebKit和Gecko浏览器中使用。这是为了保护用户的历史记录(例如,可以尝试所有可能的URL,然后将访问的URL发送给第三方。这种方式可以获取访问网址中的令牌以及其他内容)。
Timo Tijhof 2012年

2
Mozilla官方的文章,解释了隐私方面的变化:visitedhacks.mozilla.org/2010/03/...
德尼尔森Sá马亚

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

4
这是正确的答案。要么为此更新接受的答案,要么更改接受的答案。不要放弃最初接受的答案,因为这是当时的正确解决方案。
Cruncher

8

您可以使用JavaScript查看JHurrah的答案。除了不突出显示链接之外,所有隐身模式都不会保存浏览历史记录和cookie。从Google 帮助页面

  • 隐身时打开的网页和下载的文件不会记录在浏览和下载历史记录中。
  • 关闭所有打开的隐身窗口后,所有新的Cookie都会被删除。

如您所见,正常浏览和隐身浏览之间的差异是您访问网页发生的,因此,在此模式下,浏览器与服务器之间没有任何通信。

您可以使用许多HTTP请求分析器之一来查看浏览器发送给服务器的确切信息,例如此处的。比较正常会话和隐身会话之间的标题,您将看不到任何区别。


最近,它禁用了所有扩展名,但那些被用户明确标记为隐身安全的扩展名除外。
Tiberiu-Ionuț Stan

4

如果要开发扩展程序,则可以使用tabs 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的一个形式,我不熟悉,并在Windows 10.我的Netbeans IDE 8.2不支持似乎但是,如果我能得到它的工作,我也很好奇:我可以代替reject('Check incognito failed')resolve(false),如果我想isIncognito成为一个只有真或假的布尔值?谢谢。
瑞安

2
我看到了Syntax Error: await is a reserved word,我认为await总是需要在一个async函数内。所以我认为这段代码行不通。
瑞安

1
reject如果调用它将引发异常,并且不会返回任何值,所以isIncognito总是truefalse编写代码的方式。但是,如果要返回值,也可以在其中使用“解析”。这可能取决于环境如何在全局范围内处理等待?它可以在全局范围内的chrome控制台上运行,但是您可以尝试将所有内容包装起来, (async function() { 'everything here' })();以便在异步函数中运行
aljgom

2
或者,您可以只保存promise isIncognito而不是结果,然后在异步函数中运行它:let isIncognito = new Promise( ...etc然后在其他地方有一个函数,例如(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom 18-4-4

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'17年

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 2015年

已验证<Chrome>:“隐身模式错误您的浏览器似乎处于隐身模式。”
皮特·阿尔文

我认为这篇文章可以改进,因为它当然没有讲事实。事实证明,从这个答案中可以看出,有人是否想通过隐身模式或常规chrome浏览器访问过他们。
FortuneSoldier

@ILikeTacos我知道您的评论已经(超过)四年了,但是Chrome故意打破了他们的隐身检测功能,因此我仍然觉得我赢得了这一
Puppy

@Puppy好吧。但实际上没有mishravikas.com/articles/2019-07/…–
Cruncher
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.