我正在尝试开发一个 Firefox 扩展程序,以通过与用于用户跟踪目的的浏览器指纹作斗争来保护用户安全。
许多(如果不是全部)指纹技术包括记录屏幕分辨率、窗口工具栏高度等的内容navigator.plugins
。navigator.oscpu
扩展navigator.platform
的想法由两部分组成——首先是随机过滤和排列插件及其 mime 类型,并在其他变量中引入随机性用于跟踪;其次是隔离网页,以防止其重复使用以前隐藏的信息——如.sol
-cookies、使用假E-Tag
的或尚未发现的任何东西。
navigator
这两种方法都需要在特权、、、对象的不可配置属性上重新实现 getter screen
,location
这就是我被卡住的地方。
例如,在浏览器控制台中输入以下简单的代码是行不通的:
Object.defineProperty(getBrowser().contentWindow.location, 'href', {
get: function() {
return 'foobar';
}
});
它不会产生任何错误,但也不会重新定义属性。此外,它出于某种原因返回 object 的当前值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
- 或者,是否可以重新定义上述对象的不可配置属性?
- 或者,是否可以
js::NativeDefineProperty
从 chrome JavaScript 调用? - 或者(不太推荐),是否可以实现二进制附加组件以将
js::NativeDefineProperty
chrome 作为服务公开?
更新:我在 Mozilla IRC 有一个问题,位置重写与隐私有何关系。就目前而言,隐私浏览模式下的所有窗口共享相同的 cookie、存储等,因此即使在隐私模式下,如果您不经常重置它,您仍然可以被跟踪。多久太频繁是一个问题——理想情况下,您应该在每个访问过的站点后重新设置,因为每个站点都可以标记您。如果能够调整私人模式的粒度——比如将私人窗口或标签彼此分开,那就太酷了。
我想过用某种标签唯一的长随机标签来标记所有 URL——所以http://example.com/foo
在两个单独的私有标签中打开变成了http://example.com.AYZYXP/foo
and http://example.com.QUSOFX/foo
。从浏览器的角度来看,这是两个不同的域名,有自己的缓存规则、cookies、DOM 存储、IndexedDB、FlashPlayer 持久性或其他任何东西。从网页的角度来看,有必要保持两个标签的印象http://example.com/foo
,因为暴露标签会违背标签的想法——这就是我需要位置重写的原因。