在现代浏览器中,网络可以网站会检测正在访问该网站的用户是否启用了私有浏览模式?
我所做的背景研究。这是我能够找到的与此问题相关的内容。不幸的是,它并不能真正回答上述问题。
2010年对私人浏览模式的研究表明,网站可以检测浏览器是否处于私人浏览模式,通过使用CSS历史记录嗅探攻击。 (在私有浏览模式下,不会将站点添加到历史记录中,因此您可以使用历史记录嗅探功能来检查访问者是否处于私有浏览器模式。)但是,从那时起,现代浏览器就结合了针对CSS历史嗅探攻击的防御措施。 />因此,我希望检测浏览器是否处于私有浏览模式的方法不再成功。 (我知道针对历史嗅探的防御措施并不完善,但对于这些目的而言,这些防御措施可能就足够了。)
您访问的网站可能有多种方法来了解您是否目前已登录到其他网站(认为:Facebook)。如果用户当前已登录其他服务(例如Facebook),则网站可能会猜测用户当前未使用私有浏览模式-这不是确定的事情,但也许可以做出某种概率推断。但是,如果用户未登录其他服务,那么我想我们只能说不知道是否正在使用私有浏览模式。我想这可能会导致部分信息泄漏,但听起来充其量是不可靠的-即使它可行。这也可能根本不起作用。
因此,任何人都可以提供有关网站是否可以测试其访问者是否正在使用私人浏览模式的最新信息吗?
#1 楼
请注意,这个答案是在2011年给出的。今天的答案是明确的-在2020年撰写此文时,已有可靠的技术被广泛使用并且已经存在了一段时间。有关更多最新信息,请参见1 2以下的当前最新解答之一。我不确定您是否可以可靠地检测到私人浏览,但我认为您可以运用一些启发式方法做出一个很好的猜测用户正在使用各种隐私增强功能。正如我对问题的评论所指出的那样,这是否足够好或适合您的应用程序取决于您希望对检测到的私人浏览做出何种反应。正如Sonny Ordell所述,我也不确定您是否可以将私有浏览与临时使用的各种增强隐私功能(例如,手动清除历史记录或Cookie)区分开来。
假设您正在操作Web应用程序,并且您想检测您的一个用户(具有帐户)何时切换到私人浏览。我指定用户具有一个帐户,因为该策略依赖于跟踪行为数据的各个位。私人浏览的各个方面(至少在Firefox中):历史记录,表单/搜索条目,密码,下载,cookie,缓存,DOM存储。我不确定如何探测下载,但我认为其他可以探测。如果您对所有这些方法都都抱有肯定的态度,则您的用户似乎很可能在私密浏览。
在这种情况下,您可以跟踪每个用户的
(IP, user-agent)
。当您收到一个无cookie的请求以匹配(IP, UA)
记录时,您可能会推断相应的用户是私人浏览。如果出现以下情况,此方法将失败(无法检测):他在私有浏览期间使用了ProxySwitchy或TorButton之类的功能来激活Tor,从而更改了IP。
他切换到了其他浏览器(例如通常使用FF并切换到Chrome进入隐身模式)。
转到私有浏览的过程不是立即的,他的ISP已发布了一个新IP(例如,星期五他是10.1.2.3,他周末没有使用您的应用,星期一他是10.1.4.5)。
如Sonny Ordell的回答中所述,如果另一个人在私密浏览模式下使用相同的浏览器访问您网站上的另一个帐户,您会被发现-但这与“普通”用户只需切换到私人浏览模式。
如果用户只是为您的站点清除其cookie或使用辅助配置文件(例如,我保留了一些不同的Firefox配置文件,但设置为不同的设置),则您会得到误报用于某些测试和/或避免跟踪的插件,尽管我认为这很不常见)。
作为更复杂的检查,您可以使用EFF的panopticlick等工具进行维护浏览器指纹(或指纹集合),而不仅仅是每个用户的UA。在上述情况2中,此操作将失败(例如,如果用户仅使用FF进行可识别的浏览,而使用Chrome进行隐身浏览)。如果用户禁用了javascript,则指纹将更加通用(因此实用性将大大降低)。如果用户在不同的会话中有选择地启用javascript(例如具有临时允许站点的NoScript),则指纹将发生变化。
您可以通过检测通过Tor出口节点,并将其与指纹结合。看来这仅在少数情况下有用。
不仅是上述检查的cookie,还应该测试
localStorage
。如果通常已启用它,并且您的密钥不在此次访问的存储中,并且指纹匹配,则可能是私人浏览。显然,如果用户通常禁用了存储,那么您将无法使用它。故障模式与上述针对Cookie的故障模式类似。我尚未测试或提出这个想法,但我想您可以使用
Cache-Control
玩游戏。 (快速搜索发现这不是一个原始想法-该项目看起来像概念验证代码。)如果用户通过共享的缓存代理,则该策略将失败-同时页面上会提及anonymizer.com 。至少,Firefox在私有浏览模式下不使用缓存。 (有关基于缓存的跟踪的演示,请参阅此站点。)因此,您可以将其与上面提到的UA /指纹结合使用:如果您的缓存跟踪器指示这是首次访问,则可以推测该用户是私人浏览。如果用户清除其缓存,则会失败,并出现误报。结合其他技术可以得出更好的猜测。您可以为每个用户检测并跟踪浏览器是否自动填充特定表单元素。如果您检测到给定的用户没有对该表单元素进行自动填充,则可以推断为私人浏览。这很脆弱-也许用户没有使用他的“主要”计算机,但是您可以如上所述将其与指纹结合使用,以获得更可靠的猜测。
旁道计时攻击:检测并跟踪每个用户登录您的应用所需的典型时间。会有变化,但是我想您可以准确地判断出有人是否正在使用密码自动填充功能。如果用户通常使用密码自动填充功能(即通过登录页面快速转换),然后对于给定的访问(具有匹配的指纹)未使用自动填充功能,则可以推断为私人浏览。再次,这是脆弱的。与其他技术结合使用以获得更好的猜测。您还需要检测并纠正给定页面负载下的网络延迟(例如,也许用户的网络在给定的一天中速度很慢,而登录页面过渡缓慢只是延迟而并非缺乏自动填充功能)。如果您想让用户有点恼火,可以稍稍作恶并自动注销用户(给他们一个假的错误消息,“请重试”)以获取第二个数据点。
将此与您在检测用户是否登录到其他服务(例如Facebook)时所提到的内容结合起来,您可以对自己的猜测更有信心。
如果您真的有动力,可以使用DNS玩游戏并跟踪页面加载时间。对FF 3.6和Chrome 15进行的快速测试似乎表明,没有一种浏览器会在私有浏览模式下清除DNS缓存。而且浏览器绝对无法控制本地系统的DNS缓存。如果您使用侧通道DNS定时攻击来进行用户跟踪,以作为指纹的替代(或补充)手段,则可能会得到更可靠的猜测。我不确定通过DNS计时进行跟踪的可靠性如何。
在私有浏览模式下检测“匿名”用户将更加困难,因为您没有机会收集有关其“典型”行为的数据。而且,由于大多数功能仅在它们结束浏览器会话时才起作用,因此您实际上并不知道它们是否还会再回来。
话虽如此,这是一种检测匿名用户的私人浏览的想法,如果您愿意作恶,并且拥有一些资源,您知道该资源愿意让用户有第二次机会给您,那么您可以强制用户启用javascript。跟踪指纹,设置持久性cookie,localStorage,缓存-您可以执行任何跟踪用户的操作。如果是根据您的指纹进行的首次访问,请通过javascript(或Flash或您知道的任何恶作剧)使浏览器崩溃/挂起。占用大量内存,或陷入循环,或采取任何措施使用户关闭浏览器。然后,当他们返回时,您(从指纹中)看到这是第二次访问。如果未设置cookie /存储/缓存/等,则可以推断出第一个会话是私有浏览,而我想您可以推断出第二个会话也可能是私有浏览。如果用户不回来,或者您无法崩溃/说服他们杀死浏览器窗口,则这显然将失败。另外,如果将它们发送到自定义URL,并且它们处于非私有模式并恢复了浏览会话,则可以猜测它们不在私有浏览模式中(除非它们将URL标记为书签)。
上面的所有内容都充满漏洞-留有足够的空间来容忍错误的肯定或否定。您可能永远不会知道我是在使用私有浏览,还是在没有持久性存储的VM中运行浏览器。 (有什么区别?)
最糟糕的部分可能是,如果您确实获得了一种检测私人浏览的可靠方法的答案,那就是只要浏览器“修复”它或用户,它似乎不可能长期存在找到避免发现的变通办法。
评论
一个有趣的答案,但最终该问题的答案仍然是“否”。您只能猜测用户是启用了隐私功能还是实际上正在使用私有浏览模式。也可以永久地像在私有浏览模式下一样配置浏览器,在这种情况下,有什么问题?
–桑尼·奥尔德(Sonny Ordell)
2011年12月8日在16:30
@SonnyOrdell:我认为我的回答充满了免责声明,很明显,简短的回答是“否”。正如我在关于OP的评论/问题中提到的那样,我认为真正的答案取决于网站运营商希望如何进行检测。
–bstpierre
2011年12月8日在16:49
这个答案可能需要在2019年进行一些更新,在那里许多新闻站点通常都能够检测到私人浏览模式。您的答案可能在理论上是正确的,但观察到,在2019年6月,我发现许多报纸网站在确定何时开启私人/隐身模式时非常准确。
– Steve Sether
19年6月19日在20:29
#2 楼
HTML 5本地存储检查可让您立即可靠地检测私有浏览模式(2019)。它可以通过尝试编写然后读取“本地存储”来工作。请参见:
https://gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1
或
https://github.com/jLynx/PrivateWindowCheck
和PoC
------ edit to add functional description ----
来自上面的jherax链接:
...
// **Firefox**
if ('MozAppearance' in document.documentElement.style) {
if (indexedDB === null) return yes();
const db = **indexedDB.open**('test');
db.onerror = yes;
db.onsuccess = not;
return void 0;
---
从上面的jLynx
...
} else if(navigator.userAgent.includes("Firefox")){
//Firefox
var db = indexedDB.open("test");
db.onerror = function(){resolve(true);};
db.onsuccess =function(){resolve(false);};
---
在两个示例中,都无法打开持久性本地存储, Firefox的indexDB(由HTML 5定义)指示私有浏览。其他浏览器以不同的名称调用本地存储,例如localStorage,请参见图。
评论
很好的答案,尽管仅链接。在这篇文章中包括显着的代码行,并解释其工作原理,我将对此予以奖励。
–gparyani
19年6月18日在18:20
谢谢你我确实想知道这些网站如何能够如此准确地找出私人浏览模式。在2019年6月,由于任何人都知道检测很容易,因此最佳答案现在看起来很愚蠢。也许浏览器会以某种方式解决此问题,而我们将回到一个不简单的隐身模式检测世界,并且最佳答案将再次准确吗?
– Steve Sether
19年6月19日在20:37
#3 楼
您可以使用启发式进行可靠的猜测。例如,在IE10和IE11(以及Safari,IIRC)中,尝试使用IndexedDB作为浏览器处于InPrivate模式的强烈提示时引发了异常。类似,Adobe的DRM系统(由HBOGO使用,显然)在浏览器为InPrivate / Incognito时显示错误代码,因为不允许在私有模式下创建所需的“许可证工件”。 https://forums.adobe.com/thread/1189199
#4 楼
我认为这是有好处的,因为您想要一个更准确和最新的答案,但事实是,其他人已经给出了正确的答案。即使我不是JS开发人员,而且我也不知道这些东西是如何工作的,我只能给你更多细节。简单的答案是:他们使用JavaScript来实现一些功能主要用于检查某些功能是否可用的一种启发式方法。例如,请看
bostonglobe.com
。在私有模式下单击文章,您会看到以下通知:“您处于私有模式下,等等。”。如果禁用JavaScript,该通知将不会出现,这意味着它已在JS中完成。如果您去《纽约时报》,也是如此,只是JS。但是他们到底是怎么做到的呢?在bostonglobe.com
上,我在源代码中名为meter.js
的JS文件中找到了代码。如果在该代码中搜索detectPrivateMode
,则会看到其使用的功能。它是最小的,所以很难读。但是,在浏览器的dev工具中美化源代码会提供以下代码: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')
,在Safary中尝试window.openDatabase
,依此类推。所有这些功能似乎都依赖于以下事实:它们在专用模式(隐身模式)下的行为不同。大多数代码似乎都使用了与本地存储相关的功能,这些功能显然与正常模式下的行为有所不同。有多个try-catch块,因此大多数这些功能可能甚至在私有模式下也不可用。如果您用谷歌搜索这些功能中的任何一个(也可以在搜索中添加“ private”或“ incognito”),您会发现很多结果,讨论了检测私有模式的可能方法,最后,您将找到代码与我引用的内容非常相似。您将在StackExchange上找到几个问题,并在GitHub上编写代码片段。例如,有关StackExchange的答案有一些有趣的信息:https://stackoverflow.com/a/41322183 在《纽约时报》上,如果单击文章,则打开HTML源,然后搜索
webkitRequestFileSystem
,您会找到类似的代码。您可以看到,代码和使用的启发式方法可能会有一些差异,但是每个网站都可能依靠相同的代码来检测私有模式。一小部分功能。
评论
如果您的答案涵盖了私有模式和正常模式下的功能差异,那将是很好的。
–gparyani
19年6月12日在18:33
@gparyani,不幸的是,我不知道,我不喜欢这样做,无论如何,它甚至可能对本网站来说是题外话(您可能会尝试使用StackOverflow吗?)。 ,在我看来似乎还不清楚为什么这些东西有效。也可能很难找到官方文档,因为我怀疑其中一些东西甚至是非标准的。如果有人要添加一些东西或更好的答案,那么我们将看到。希望这对您有帮助。
–芦苇
19年6月12日在18:40
@reed感谢您更新2011年的信息并运行测试!
– schroeder♦
19年6月12日在19:09
#5 楼
显然,对于台式机Safari和移动Safari,网站可以通过某些方式检测到您处于“私人浏览”模式。在“私人浏览”模式下,桌面Safari不会请求收藏夹图标,这使事情变了。它还具有其他区别。
在“私人浏览”模式下,Mobile Safari不支持HTML5本地存储,该模式也可以在网站上检测到。
#6 楼
截至2020年3月,似乎网站仍然有可能基于Firefox在私有模式下运行时IndexedDB无法运行的事实来检测Firefox是否以私有模式运行。有许多主流媒体似乎正在使用该技术来阻止用户以私有模式浏览其网站,或强迫他们登录。示例代码的GitHub要点:https:// gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1
以上代码的工作演示:https://output.jsbin.com/tazuwif
带有更多信息的Bugzilla线程:https: //bugzilla.mozilla.org/show_bug.cgi?id=781982https://bugzilla.mozilla.org/show_bug.cgi?id=1506680
#7 楼
简单的答案是否定的。仅检测未保存的历史记录并不表示正在使用私有浏览模式,而仅表示未保存历史记录,这在任何浏览器中均可轻松配置。
为什么登录到其他服务意味着您没有使用私人浏览模式?我经常在其他人的计算机上以私人浏览模式使用Facebook,因为这意味着我不必注销它们,这是进行我自己的会话而不丢失其状态的简便方法。
浏览模式仅启用您可以在正常模式下自行配置的功能。为了方便起见,它可以在一个临时时间段内一次启用多个功能。无法判断是否有人正在使用私人浏览模式,或者只是启用了这些功能。
评论
我认为这不是真正的响应性或准确性。对此肯定有试探法,报纸等网站都在使用它们。在我的使用中,它们似乎确实能够检测到我何时处于私有模式。它们是启发式的事实并不意味着它们根本不起作用。
– Ben Crowell
19年6月11日在14:45
评论
最终目标是什么?通过检测私密浏览模式,网站可以实现什么?隐私浏览的哪个方面对您很重要-Cookie,历史记录,缓存等?私人浏览和例如一次性Firefox配置文件之间有什么区别?还是使用privoxy设置来删除所有cookie?“我做过的背景研究。” +1问题本身值得一读。谢谢。
这里有一些其他信息:apple.stackexchange.com/questions/131587/…值得注意的是,专用于Mavericks下的Safari,私有浏览模式不会发送对网站图标的请求,因此这可能是发现P.B.的载体。已开启。
有更多最新信息的答案会很有帮助。我认为自2011年提出此问题以来,情况已经发生了很大变化。现在,在2019年,对于报纸网站来说,如果它们检测到/认为您处于私有模式,则拒绝访问是相当标准的。因此,它可能只是一种启发式方法,但不再是假设,而是常用。我希望提供赏金来获得最近的答案,但是显然,SE软件不会让我提供小赏金,因为我的代表仅为244。
@BenCrowell我开始悬赏这个问题。