javascript - 如何使用 Firefox 扩展模拟 `location` , `navigator` 和 friend 的特定页面?

标签 javascript security firefox firefox-addon fingerprinting

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

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

这两种方法都需要在特权 navigatorscreenlocation 对象的不可配置属性上重新实现 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 结束,在那里完成了实际的对象修改。

所以,问题是:

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

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

我考虑过用某种标签唯一的长随机标签来标记所有 URL — 所以在两个单独的私有(private)标签中打开的 http://example.com/foo 变成了 http://example.com.AYZYXP/foohttp://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/

相关文章:

css - 在 IE 中用 CSS 覆盖对象失败得很惨

javascript - 如何控制动态添加的输入类型文件?

JavaScript - 在函数回调之间共享值

security - 最佳实践-重新运行bash以附加到Docker运行实例

php - PHP 和 MySQL 中的加盐

css - SVG 不会留在 Firefox 中的 <div> 中

javascript - Blueimp jQuery 文件上传 - 上传完成响应后隐藏队列中的文件

javascript - 当我使用 canvas 和 requestAnimationFrame 对图像数组进行动画处理时出现位置问题

security - Jester 中的 CSRF 防伪 token

java - Selenium 2.20 : how to handle User Identification Request dialog