【问题标题】:Puppeteer fingerprint simulation木偶指纹模拟
【发布时间】:2020-01-04 08:23:39
【问题描述】:

通过进行测试,我面临着 JavaScript 指纹识别,例如:

  • 音频上下文指纹
  • opengl 指纹识别
  • 画布指纹
  • 已安装字体指纹
  • 已安装的插件指纹识别
  • webrtc

我想用模拟结果替换指纹识别结果。

指纹如何工作以及如何模拟/伪造指纹结果?

【问题讨论】:

  • “输出特定值”是什么意思?您是在寻找指纹集合还是想知道指纹是如何工作的?
  • 我知道这是什么。我在问如何更改 puppeteer 中使用的无头浏览器的指纹输出。例如 webgl fp: browserleaks.com/webgl 或 canvas fp: browserleaks.com/canvas 。我发现存在一些可以制作独特 fp 的插件,例如“CanvasFingerPrintBlock”或“AudioContext Fingerprint Defender”。是否可以运行此类插件或进行调整,以便指纹是唯一的?
  • 了解指纹识别在无头浏览器中的工作原理以及是否存在 fp 集合可能会有所帮助 - 是否可以将 fp 从集合中更改为一个?如何管理这个?谢谢
  • 我明白了,我添加了一个答案,展示了这些指纹如何工作的示例。
  • @Vladmir 您找到合适的解决方案了吗?你能分享一下吗?您是否考虑过在具有不同配置/字体等的不同 docker 容器中运行 puppeter?

标签: python node.js puppeteer fingerprinting audio-fingerprinting


【解决方案1】:

要更改这些指纹的结果,您必须了解它们的工作原理。我们来看一个例子:Canvas Fingerprint of browserleaks.com

工作原理

网站将使用浏览器 API 通过将一些文本绘制到画布上来生成画布图像。由于渲染完成方式的不同,指纹在不同的浏览器和机器中略有不同。有关详细信息,请查看页面的 "How does it work" 部分。

模拟(或伪造)指纹

要更改指纹,您需要检查页面的指纹 JavaScript 正在使用哪些 API,并将其替换为适应版本。

代码示例

以下代码将本机 HTMLCanvasElement.prototype.toDataURL 函数替换为自定义函数(在页面上执行任何其他代码之前)。如果该函数检测到该网站正在绘制宽度为220px 和高度为30px 的图像,它会返回一个假指纹。否则,它会运行原始的 toDataURL 函数,以免与任何其他功能混淆。

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

    await page.evaluateOnNewDocument(() => {
        const originalFunction = HTMLCanvasElement.prototype.toDataURL;
        HTMLCanvasElement.prototype.toDataURL = function (type) {
            if (type === 'image/png' && this.width === 220 && this.height === 30) {
                // this is likely a fingerprint attempt, return fake fingerprint
                return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAAeCAAAAABiES/iAAACeElEQVRYw+2YzUtUURjGf47OmDPh5AyFomUiEeEmyghXtWsh4dcswlYV2KYWfZh/QRBUVLhTCCJXEgmKUCIkFhJREARBkbkyKBlTRmUC82lxZ7z3TjM4whwXwz2ry3vO87znx33Pey4XFfHAg/PgPDgPzoPz4Dy4rFIKscSkAfmnsUY+iTfXFhxue4Zm4QpfaKbg8k+EsZNsGG6iNVzRMrkZeRPmjp6eCgcae5f+3wJIgtWLldG+DUnfzoail1etaVsEa1f2lUqw2hPd3T7nCrkMtlkQ24YDwP8+FZkI+gY3uq2cTcu54GIA/dJCDUAnSE4RdAESdALUxZ0hl4E5OMs49iE528E5a+cj5YFhDVI3vLA2c4K+zLXpvR37tNRDs3STg1OJqXqQSwS14wlJUD+VeHWAW86Qy8BwQ5Ek/WK/JBgqC72UTvJakmY5lAvurTRPSDrMmKRRcIvgeUo2KmmEI86Qy8DwmVu/ezQIBCSBLzwjKZhujv5cZZmUNkAq57ekRXCLYDG12pre5Qy5DAzDXbPfIOB/JqmCzNafCZd+dMA5RfZxdsBlNTAMF+FJfD2eSvSI0iGpmXe5GnbG3qyyHAO3yCZxlGV2uBLWDcJVMZKc7UrnfIBvQI+pHpxbS34ZaNkK7gYN0yvTDSCXyCZxNJTscFFe/DUH1w3QvpnzPiUPdTXfsvxZDdBGmeQU2SQd9lWQHS5m9J6Ln4/suZCwc96D25qM1formq5/3ApOX1uDkZ7P7JXkENkkK5eqQm3flRtuvitSYgCucKOf0zv01bazcG3Tyz8GKukvSjjrlB3/U5Rw42dqAo29yypKOO8figeX1/gH+zX9JqfOeUwAAAAASUVORK5CYII=';
            }
            // otherwise, just use the original function
            return originalFunction.apply(this, arguments);
        };
    });
    await page.goto('https://browserleaks.com/canvas');
})();

结果

以下是页面截图。通常,页面会显示指纹图像,但在我们的例子中,它显示的是“假指纹”。这样一来,我们就欺骗了页面,让其认为这是我们浏览器的指纹。

其他指纹方法的工作原理

其他指纹方法的工作原理类似。他们调用现有的浏览器 API 并根据结果创建指纹。通过替换所有使用的功能,您可以更改浏览器的指纹。但这需要做很多工作,因为您必须检查网站如何使用 API,然后想出替换这些 API 的功能。

【讨论】:

  • 很好的答案,但网站不能说它不是用于指纹的图像还是伪造的?
  • @Carson 指纹的重点在于不同浏览器和系统的图像不同。但是,是的,如果图像太不同(如我的示例图像),那么检测起来很简单。这就是为什么实际上您不应该使用我使用的“假指纹”图像,而是从您尝试模仿的浏览器中复制图像,或者使用 Photoshop 自己创建一个看起来相似的图像。
  • 感谢您抽出宝贵时间回复我。从偶然的角度来说,手动更改图像会不会产生非常独特的指纹,因为任何其他设备都不太可能以这种方式合法地生成图像?最好的选择不是拿几台最常用的 PC,用它们来创建指纹图像,然后只使用这些图像吗?还是我误会了?
  • @Carson 这取决于你的目标是什么。如果您想要一个唯一的指纹,您应该自己创建一个。如果您试图模仿现有浏览器,最好从该浏览器复制指纹。
  • 知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多