我看到有一个赏金,因为你想要一个更精确和最新的答案,但事实是其他人已经给出了正确的答案。尽管我不是 JS 开发人员,而且我也不知道这些东西是如何工作的,但我可以给你更多细节。
简短的回答是:他们使用 JavaScript 来实现某种启发式方法,主要检查某些功能是否可用。
看看bostonglobe.com
例如。在隐私模式下点击一篇文章,您会看到提示:“您处于隐私模式等”。如果禁用 JavaScript,则不会出现该通知,这意味着它是在 JS 中完成的。如果你去纽约时报也是如此,它只是 JS。但他们究竟是如何做到的呢?在bostonglobe.com
我发现一个名为JS文件的代码meter.js
源。如果您在该代码中搜索,detectPrivateMode
您将看到它使用的功能。它被缩小了,所以阅读起来很痛苦。然而,在浏览器的开发工具中美化源代码会给出以下代码:
detectPrivateMode: function (t) {
var e;
if (window.webkitRequestFileSystem) window.webkitRequestFileSystem(window.TEMPORARY, 1, function () {
e = !1
}, function (t) {
console.log(t),
e = !0
});
else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
var i;
try {
i = window.indexedDB.open('test')
} catch (t) {
e = !0
}
void 0 === e && n(function () {
return 'done' === i.readyState
}, function (t) {
t || (e = !i.result)
})
} else if (r(window.navigator.userAgent)) {
e = !1;
try {
window.indexedDB || (e = !0)
} catch (t) {
e = !0
}
} else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
if (window.safariIncognito) e = !0;
else {
try {
window.openDatabase(null, null, null, null)
} catch (t) {
e = !0
}
try {
window.localStorage.setItem('test', 1)
} catch (t) {
e = !0
}
}
void 0 === e && (e = !1, window.localStorage.removeItem('test'))
}
n(function () {
return void 0 !== e
}, function (n) {
t(e)
})
}
例如,您可以看到他们正在尝试使用window.webkitRequestFileSystem
,在 Firefox 中他们会尝试window.indexedDB.open('test')
,在 Safarywindow.openDatabase
, 等等。所有这些功能似乎都依赖于它们在私人模式(隐身模式)下表现不同的事实。大多数代码似乎使用与本地存储相关的函数,这显然与正常模式下的行为不同。有几个 try-catch 块,因此其中大多数功能甚至可能在私有模式下都不可用。如果你用谷歌搜索这些功能中的任何一个(也可能在搜索中添加“私人”或“隐身”),你会发现很多讨论检测私人模式的可能方法的结果,最后你会发现代码看起来与我引用的非常相似。您会在 StackExchange 以及 GitHub 上的代码片段上找到几个问题。例如,StackExchange 上的这个答案有一些有趣的信息:https ://stackoverflow.com/a/41322183
在《纽约时报》上,如果你点击一篇文章,打开 HTML 源代码,然后搜索webkitRequestFileSystem
,你会发现类似的代码。
如您所见,代码和它们使用的启发式方法可能存在一些差异,但每个网站都可能通过依赖相同的一小部分函数来检测私有模式。