我正在尝试开发一个 Firefox 扩展,通过与用于用户跟踪目的的浏览器指纹作斗争来保护用户安全。
许多(如果不是全部)指纹识别技术包括记录 navigator.plugins
、navigator.oscpu
、navigator.platform
、屏幕分辨率、窗口工具栏高度等。扩展的想法由两部分组成——首先是随机过滤和排列插件及其 mime 类型,并在用于跟踪的其他变量中引入随机性;其次是隔离网页以防止其重复使用以前隐藏的信息——例如 .sol
-cookies,利用假的 E-Tag
或任何尚未发现的信息。
这两种方法都需要在特权 navigator
、screen
、location
对象的不可配置属性上重新实现 getter,这就是我卡住了。
例如,在浏览器控制台中输入以下简单代码是行不通的:
Object.defineProperty(getBrowser().contentWindow.location, 'href', {
get: function() {
return 'foobar';
}
});
它不会产生任何错误,但也不会重新定义属性。此外,它出于某种原因返回 location
对象的当前值 — 这是我不希望从 Object.defineProperty
中得到的。
将 location
替换为 location.wrappedJSObject
会使浏览器吐出 TypeError: can't redefine non-configurable property 'href'
,与什么非特权代码会抛出。
我试图追踪当您对某物调用 Object.defineProperty
时会发生什么。它似乎以 js::obj_defineProperty()
开始,然后转到 js::StandardDefineProperty
,后者又进行了几次检查,然后下降到 js::DefinePropertyOnObject
,其中有大量我还没有完全理解的检查,最后以 js::NativeDefineProperty
结束,在那里完成了实际的对象修改。
所以,问题是:
- 是否可以完全重新定义页面内容沙箱的
location
、navigator
、screen
对象,用一些模拟代理替换它们,受控通过我的分机? - 或者,是否可以重新定义上述对象的不可配置属性?
- 或者,是否可以从 chrome JavaScript 调用
js::NativeDefineProperty
? - 或者(不太推荐),是否可以实现二进制附加组件以将
js::NativeDefineProperty
作为服务公开给 chrome?
更新:我在 Mozilla IRC 上有一个问题,位置重写与隐私有(private)何关系。目前,所有处于隐私浏览模式的窗口都共享相同的 cookie、存储空间等,因此如果您不经常重置它,即使在隐私模式下您仍然可以被跟踪。多久一次是太频繁是一个问题——理想情况下,您应该在每次访问网站后重置,因为每个网站都可以标记您。如果能够调整隐私模式的粒度,那就太棒了——比如,将隐私窗口或标签页彼此分开。
我考虑过用某种标签唯一的长随机标签来标记所有 URL — 所以在两个单独的私有(private)标签中打开的 http://example.com/foo
变成了 http://example.com.AYZYXP/foo
和 http://example.com.QUSOFX/foo
。从浏览器的 Angular 来看,这是两个不同的域名,具有自己的缓存规则、cookie、DOM 存储、IndexedDB、FlashPlayer 持久性或其他任何东西。从网页的 Angular 来看,有必要保持两个选项卡都是 http://example.com/foo
的印象,因为公开标签会违背标记的想法——这就是我需要位置重写的原因。
最佳答案
可能有一种方法可以进行更改,浏览器会将其发送到所有内容,window.navigator.blah
的 javascript 代码将返回您覆盖的值。如果我发现类似的东西,我会睁大眼睛。
这是 XPCOM 引用:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface
我敢肯定,如果你探索所有这些,你会发现一些东西来覆盖东西。
但下面是一个附加观察者的解决方案
我不确定你是否设置了请求或响应 header ,如果 window.navigator.blah
的 javascript 将返回什么但它值得一试,无论如何复制粘贴代码。检查一下。
您所做的是为 http-on-modify-request
设置一个观察者(或者其他观察者可能在这里看到:MDN :: Observer Notifications - HTTP Requests)
然后在观察者的处理程序中,您可以使用 setRequestHeader
等进行修改,如果您对 http-on-examine-response 进行观察,甚至可以
。setResponseHeader
请参阅本主题,此处的示例代码仅针对第一个选项卡欺骗用户代理:How can I change the User Agent in just one tab of Firefox?
关于javascript - 如何使用 Firefox 扩展模拟 `location` , `navigator` 和 friend 的特定页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28379806/