3

我正在尝试开发一个 Firefox 扩展程序,以通过与用于用户跟踪目的的浏览器指纹作斗争来保护用户安全。

许多(如果不是全部)指纹技术包括记录屏幕分辨率、窗口工具栏高度等的内容navigator.pluginsnavigator.oscpu扩展navigator.platform的想法由两部分组成——首先是随机过滤和排列插件及其 mime 类型,并在其他变量中引入随机性用于跟踪;其次是隔离网页,以防止其重复使用以前隐藏的信息——如.sol-cookies、使用假E-Tag的或尚未发现的任何东西。

navigator这两种方法都需要在特权、、、对象的不可配置属性上重新实现 getter screenlocation这就是我被卡住的地方。

例如,在浏览器控制台中输入以下简单的代码是行不通的:

Object.defineProperty(getBrowser().contentWindow.location, 'href', {
    get: function() {
        return 'foobar';
    }
});

它不会产生任何错误,但也不会重新定义属性。此外,它出于某种原因返回 object 的当前值location——这是我不期望的Object.defineProperty

替换locationlocation.wrappedJSObject使浏览器吐出TypeError: can't redefine non-configurable property 'href',与非特权代码将抛出的相同。

我试图追查当你打电话时会发生Object.defineProperty什么。它似乎从 开始js::obj_defineProperty(),然后转到js::StandardDefineProperty,依次进行几次检查,然后下降到js::DefinePropertyOnObject,其中有大量我尚未完全理解的检查,最后以 结束js::NativeDefineProperty,实际对象修改完成的地方。

所以,问题是:

  1. 是否可以完全重新定义页面内容沙箱的对象location,用我的扩展程序控制的一些模拟代理替换它们?navigatorscreen
  2. 或者,是否可以重新定义上述对象的不可配置属性?
  3. 或者,是否可以js::NativeDefineProperty从 chrome JavaScript 调用?
  4. 或者(不太推荐),是否可以实现二进制附加组件以将js::NativeDefinePropertychrome 作为服务公开?

更新:我在 Mozilla IRC 有一个问题,位置重写与隐私有何关系。就目前而言,隐私浏览模式下的所有窗口共享相同的 cookie、存储等,因此即使在隐私模式下,如果您不经常重置它,您仍然可以被跟踪。多久太频繁是一个问题——理想情况下,您应该在每个访问过的站点后重新设置,因为每个站点都可以标记您。如果能够调整私人模式的粒度——比如将私人窗口或标签彼此分开,那就太酷了。

我想过用某种标签唯一的长随机标签来标记所有 URL——所以http://example.com/foo在两个单独的私有标签中打开变成了http://example.com.AYZYXP/fooand http://example.com.QUSOFX/foo。从浏览器的角度来看,这是两个不同的域名,有自己的缓存规则、cookies、DOM 存储、IndexedDB、FlashPlayer 持久性或其他任何东西。从网页的角度来看,有必要保持两个标签的印象http://example.com/foo,因为暴露标签会违背标签的想法——这就是我需要位置重写的原因。

4

1 回答 1

0

可能有一种方法可以进行更改,浏览器会将其发送到所有内容,并且 javascript 代码window.navigator.blah将返回您覆盖的值。如果我发现类似的东西,我会睁大眼睛。

这是 XPCOM 参考:https ://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface

我敢肯定,如果您探索所有这些,您会发现可以覆盖的东西。

但下面是一个附加观察者的解决方案

我不确定您是否设置了请求或响应标头,如果 javascriptwindow.navigator.blah将返回什么但值得一试,无论如何都要复制粘贴代码。一探究竟。

您所做的是为http-on-modify-request(或者其他人在此处查看其他观察者:MDN :: Observer Notifications - HTTP Requests)设置一个观察者

然后在观察者的处理程序中,您可以使用setRequestHeaderetc 进行修改,即使setResponseHeader您对http-on-examine-response.

请参阅此主题,此处的示例代码仅欺骗第一个选项卡的用户代理:如何在 Firefox 的一个选项卡中更改用户代理?

于 2015-02-08T10:37:55.667 回答