检测浏览器是否使用私密浏览模式

Ste*_*eve 64 html javascript browser security cookies

我正在为一家关于安全问题的公司建立一个外联网.他们希望确保其用户正在浏览网站,并在其网络浏览器中启用私人浏览模式,以便不保留任何Cookie或历史记录.

我发现只有这个 http://jeremiahgrossman.blogspot.com/2009/03/detecting-private-browsing-mode.htmlhttps://serverfault.com/questions/18966/force-safari-to-operate-in-私人模式和检测,该状态-从-A-Web服务器

理想的解决方案是使用no或minimal javascript.试图为所有浏览器和平台设置一个独特的cookie吗?有人这样做过吗?

谢谢!


更新

http://crypto.stanford.edu/~collinj/research/incognito/使用其他海报提到的浏览器fingerprinters的CSS访问技术 - 感谢提示.

我喜欢它,因为它小而优雅,但仍然希望能够在没有javascript的情况下做到这一点,如果可能的话.

Dwa*_*ton 53

对于遇到此问题的其他人,请注意截至2014年,没有可靠或准确的方法来检测是否有人通过Javascript或CSS在隐身/私人/安全浏览模式下浏览.曾经像CSS历史黑客一样工作的以前的解决方案已被所有浏览器供应商所使用.

永远不应该存在需要在正常的日常网站上检测隐私浏览模式的情况.由于自身原因,人们选择匿名浏览或不匿名浏览.

Chrome和Firefox等浏览器不再禁用localStorage等功能.他们只是将其命名为临时位置,以防止使用它的网站出错.完成浏览后,命名空间将被删除,并且不会保存任何内容.如果您正在测试localStorage支持而不管模式如何,对于支持它的浏览器,它将始终返回true.

如果公司需要内部,您应该开发一个浏览器插件.Chrome和Firefox特别公开内部API,允许插件检查用户是否处于隐私浏览/隐身模式并相应地执行操作.它不能在插件之外完成.

如果公司正在做决定并且这很重要,那么只需检查您是否处于私密/隐身模式并且阻止您浏览直到开启的插件对于任何了解一点Javascript的开发人员来说都应该是一个简单的壮举.然后,您会要求所有公司员工安装此插件.

  • `永远不应该存在需要检测隐私浏览模式的情况`并非严格正确,苹果存在问题:http://stackoverflow.com/questions/21159301/quotaexceedederror-dom-exception-22-an-attempt-was -made-to-add-something-to-st最好通知客户端它不会在私有模式下工作. (38认同)
  • "永远不应该需要在正常的日常网站上检测隐私浏览模式" - 实际上,这里只有一个.我们正在建立一个为暴力侵害妇女行为提供资源的网站.作为该网站的一部分,我们希望教育那些没有以私人模式浏览的用户,他们需要使用私有模式来确保网站访问不在其历史记录中.我想检测用户是否处于私有模式,如果是这种情况,则提供有关如何清除最近缓存并以私有模式返回的适当说明. (18认同)
  • 我们有多个用户没有意识到他们处于隐私浏览模式,并认为我们的网站存在问题.我完全不同意你的假设,即永远不需要检测到这一点. (4认同)
  • 哦,有*案件,相信我.如果您以cookie身份登录,WordPress就会存储.当您关闭私人模式选项卡或窗口时,这些会被破坏.在目前的一个案例中,我们遇到的问题是人们不断咆哮他们必须一遍又一遍地登录,因为_Safari_私人模式基本窗口确实_not_解释了Cookie会发生什么.他们只是认为"历史没有得救",并相信这将有助于保持他们的东西私密. (3认同)
  • 我不知道如何,但《纽约时报》仍然可以检测我是否使用私人模式。https://imgur.com/a/7z6E388 (3认同)
  • 纽约时报现在正在其网站上执行此验证,并要求您登录或创建帐户。以前(大约一周前),如果您达到了“免费文章”的限制,则可以以隐身模式加载网站并阅读所有内容。我想他们流行了!这也反驳了您的说法,即永远不会有用于检测私有浏览模式的用例。 (2认同)
  • @professor-falken - 似乎无论它们是否处于私人模式,这些信息都值得放在页面上?(参见大多数网站现在都有的 cookie 弹出窗口)。 (2认同)

Jez*_*z D 40

这是一种更简单的方法来检测隐私模式.这仅适用于Safari.我创建它是因为我正在开发的Web应用程序使用localStorage.在隐私模式下,Safari中不提供LocalStorage,因此我的应用程序将无法运行.在页面加载时,运行下面的脚本.如果我们不能使用localStorage,它会显示一个警告框.

try {
  // try to use localStorage
  localStorage.test = 2;        
} catch (e) {
  // there was an error so...
  alert('You are in Privacy Mode\nPlease deactivate Privacy Mode and then reload the page.');
}
Run Code Online (Sandbox Code Playgroud)

  • 这只是由于Safari中的一个错误才有可能,从iOS 11开始修复了这个错误 (2认同)

man*_*niL 23

可以检测大多数使用过的浏览器的启用隐私浏览模式.这包括Safari,Firefox,IE10,Edge和谷歌浏览器.


火狐

启用Firefox的隐私浏览模式时,IndexedDB会抛出InvalidStateError,因为它在隐私浏览模式下不可用.

如果那样:

var db = indexedDB.open("test");
db.onerror = function(){/*Firefox PB enabled*/};
db.onsuccess =function(){/*Not enabled*/};
Run Code Online (Sandbox Code Playgroud)

苹果浏览器

对于Safari,关键是本地存储服务.它在隐私模式下被禁用.因此,尝试访问它并使用try-catch子句.以下方法适用于OSX和iOS设备.这种方法的功劳正在回答这个问题

var storage = window.sessionStorage;
try {
    storage.setItem("someKeyHere", "test");
    storage.removeItem("someKeyHere");
} catch (e) {
    if (e.code === DOMException.QUOTA_EXCEEDED_ERR && storage.length === 0) {
        //Private here
    }
}
Run Code Online (Sandbox Code Playgroud)

IE10 /边缘

Internet Explore甚至会在隐私模式下禁用IndexedDB.所以检查是否存在.但这还不够,因为旧浏览器可能甚至没有IDB.所以做另一个检查,例如,对于只有IE10和后续浏览器具有/触发的事件.有关CodeReview的相关问题,请点击此处

if(!window.indexedDB && (window.PointerEvent || window.MSPointerEvent)){
 //Privacy Mode
}
Run Code Online (Sandbox Code Playgroud)

Chromes Incognito模式可以通过文件系统进行验证.可以在SO上找到一个很好的解释

var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
    console.log("FS check failed..");
    return;
}

fs(window.TEMPORARY, 100, function (fs) {}, function (err) {
//Incognito mode
});
Run Code Online (Sandbox Code Playgroud)


End*_*ess 16

这是我对检测私人模式的看法

function detectPrivateMode(cb) {
    var db,
    on = cb.bind(null, true),
    off = cb.bind(null, false)

    function tryls() {
        try {
            localStorage.length ? off() : (localStorage.x = 1, localStorage.removeItem("x"), off());
        } catch (e) {
            // Safari only enables cookie in private mode
            // if cookie is disabled then all client side storage is disabled
            // if all client side storage is disabled, then there is no point
            // in using private mode
            navigator.cookieEnabled ? on() : off();
        }
    }

    // Blink (chrome & opera)
    window.webkitRequestFileSystem ? webkitRequestFileSystem(0, 0, off, on)
    // FF
    : "MozAppearance" in document.documentElement.style ? (db = indexedDB.open("test"), db.onerror = on, db.onsuccess = off)
    // Safari
    : /constructor/i.test(window.HTMLElement) || window.safari ? tryls()
    // IE10+ & edge
    : !window.indexedDB && (window.PointerEvent || window.MSPointerEvent) ? on()
    // Rest
    : off()
}

detectPrivateMode(function (isPrivateMode) {
    console.log('is private mode: ' + isPrivateMode)
})
Run Code Online (Sandbox Code Playgroud)

编辑发现一个现代的,更快的,synkronas方式在firefox中尝试它(他们没有在privat模式下的服务工作者)类似于不包括indexedDB

: "MozAppearance" in document.documentElement.style ? navigator.serviceWorker ? off() : on()
Run Code Online (Sandbox Code Playgroud)

  • 注意:IE10或11中本身不支持Promise.我假设你在这里使用了polyfill?http://caniuse.com/#search=promise (2认同)

Mat*_*t S 14

您的网页无法确切地知道用户处于隐私浏览模式.在更新安全实施时,任何检查各种浏览器功能的尝试都需要经常更改.它可能在某些浏览器中工作一段时间,但不是全部.

如果该公司担心安全性,我建议使用锁定的隐私设置来滚动您自己的Firefox或Chromium发行版,并且只允许该自定义客户端连接到Extranet.

  • 有什么支持证据?没有告诉您私人浏览是否开启的"指纹"?该公司"对安全性存在偏执",因此依靠所谓的指纹是不够的. (2认同)

小智 6

许多人似乎认为不再可能检测隐身/私人模式,我可以向您保证这绝对不是真的。我一直无法找到任何可在 100% 浏览器上运行的公开可用代码,因此我编写了自己的代码。

截至 2021 年 10 月,我的代码能够检测 Safari 15(macOS 和 iOS)、Chrome 93、Edge 93、Firefox 93、Internet Explorer 10+ 以及 Brave 上的隐私浏览模式。

我还应该注意到,检测隐身具有合法的、非付费专区相关的用途,我将其用作更大的私人项目的一部分。例如,诈骗者在进行信用卡诈骗时经常使用隐身方式。虽然单独以隐身方式填写结账表格的人不会立即尖叫欺诈,但与其他数据点(例如也使用 VPN 的用户)配对,我会对接受这样的订单持谨慎态度。

根据用户是否处于隐身状态来阻止访问的网站很糟糕,但我将其更多地归咎于糟糕的网站设计。

无耻插件:https://github.com/Joe12387/detectIncognito

我还有一个可用的演示: https: //detectincognito.com/

我希望这是有帮助的。


jLy*_*ynx 5

我建立了一个小库,该库将在我测试过的所有主要平台和浏览器上运行:https : //github.com/jLynx/PrivateWindowCheck

您可以简单地致电

isPrivateWindow(function(is_private) {
    if(is_private)
        alert('Private');
    else
        alert('Not Private');
});
Run Code Online (Sandbox Code Playgroud)

  • 该方法的命名看起来错误。它应该是“alertIfPrivateWindow”,因为该函数是alert()ing。使用“is”前缀表明返回一个布尔值;这是错误的。 (2认同)