javascript - 如何保证客户端请求中的指纹值不是伪造的

标签 javascript fingerprint fingerprintjs2

JS指纹是在客户端使用像fingerprint2这样的库计算的。 .

我的问题是,如果我通过 ajax 发送这个值,用户可以用一点点努力来伪造这个值,并且只发出一个假的 post 请求,它将被服务器代码解释为合法。

我的问题是,如果发生这种情况,甚至无需更改浏览器中的任何属性(这将更改浏览器指纹)就可以轻松绕过该库。

我的解释对吗?我如何确保该值的完整性?

最佳答案

你不能,我真的不会担心。

规则 1:来自用户计算机的所有输入都可以伪造并且不能 100% 依赖。

如果您愿意,您可以将服务器端指纹与库加倍,如 piwik device detector匹配数据,但你却无缘无故地让自己头疼。

90% 访问您的用户,不会知道您在做什么,并为您提供可靠的数据。他们甚至不会有广告拦截。他们会给你可靠的数据。

9% 的访问者可能有一个广告拦截器,它可能会也可能不会阻止这些 ajax 请求。他们希望您尊重他们的隐私,这样做是为了让他们成为客户。 1% 可能知道这些 ajax 请求做了什么,但他们永远不会发现,因为他们不会费心检查他们访问的每个网站的控制台。这 1% 中的 1% 可能会查看浏览器控制台并找出浏览器指纹。

那 1% 的 1% 中的 1% 会窃取您的指纹识别代码。 1% 中的 1% 中的另外 1% 会尝试仅为 lulz 伪造它,然后忘记它。

所以简而言之,不要打扰。人们也不会打扰。

但如果你真的必须打扰,让自己头疼:

  • 以跟踪 cookie 的形式将用户 ID 存储在客户端计算机上的数据库中。还将其存储在 session 存储、本地存储、浏览器可能提供的任何数据库引擎中。 (请注意,当欧洲用户访问您的网站时,您需要将其放在您的 cookie 使用免责声明中,为什么要在用户计算机上存储数据)
  • 使用该用户 ID 将指纹与用户匹配。请注意,任何缓存清除机制(cccleaner、病毒扫描程序、用户点击空历史记录等)都可以随时删除此 ID。
  • 将用户 ID 放在 window.name 对象中。只要选项卡处于打开状态,使用它就会被保留,并尝试在用户计算机上重置/保存它。
  • 将 E-TAG 添加到您的图像中,用户计算机将在下次访问时尝试使用该 etag 编号请求该图像。拦截该请求(不要让网络服务器处理它,而是在 php/jsp/asp/whatever 中处理它),以便您可以识别用户。使用正确的用户 ID 设置 session 变量并“响应”该图像在该 etag 值下仍然有效,并使用 cookie 返回正确的用户 ID
  • 根据用户 ID 将“时间戳”值放在 javascript 请求后面,并将包含该 javascript 文件的请求页面设置为在 180 天左右过期。每次用户回来并且用户没有清除他的历史记录时,它都会使用给定的“时间戳”获取参数 gotcha.js?time=1283737273873 发出 javascript 请求。
    再次使用服务器端脚本进行拦截。然后就可以使用ajax 来更新页面的内容了。
  • 在您的页面上包含诸如谷歌地图之类的内容。如果他们使用 gmail 或任何谷歌服务,并且他们同意谷歌设置 cookie,谷歌将转储他们的浏览器中充满 cookie,这可能会持续一段时间。谷歌地图 cookie 至少在浏览器 session 中保持不变,并且可以通过 javascript/服务器端脚本读取。
  • 使用 piwik 设备检测器来构建服务器端浏览器指纹,用它来缩小对哪个用户的猜测。
  • 将您的请求编码为字节缓冲区/流,并对其进行 base64 编码以猜测它更难的是什么,即使他们对它进行 base64 解码并将请求分为两部分发送,一部分带有验证哈希,另一部分带有指纹。然后匹配散列和内容,如果匹配,您可以确定如果它被欺骗,有人经历了很多努力。
  • 缩小和混淆你的代码,也在你的 javascript 代码中有很多无用的侧街。将每一行放在它自己的功能中,并将它们链接在一起以形成一个有凝聚力的东西。花太多精力去推断那里发生的事情。

  • 除此之外,我真的可以推荐你:不要打扰。这不值得付出努力。想规避的人会规避。他们将禁用 javascript、排除该脚本、在继续或离开站点之前删除所有 cookie、更改已注册的字体插件等...
    不要追逐那些不想被追逐的人。专注于不关心的群体。

    关于javascript - 如何保证客户端请求中的指纹值不是伪造的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47094888/

    相关文章:

    c - 下面的代码有什么问题

    java - 如何使用指纹扫描仪对用户进行身份验证

    angular - 在 Angular 项目中导入库时出现“找不到模块 fingerprintjs2”错误

    angular - @types/fingerprintjs2 坏了吗? (与 Angular 5 一起使用)

    python - 并行 Selenium 测试的指纹问题

    javascript - Highcharts 中没有转义字符的 Json 字符串

    javascript - 高库存 - "destroy is not a function"错误

    javascript - 如何找到 'parent'节点的 'this'?

    javascript - 取消多个复选框上的复选框选择状态

    java - 如何在 Java Web 应用程序中集成指纹扫描仪