如何保证指纹值不会在客户端的请求中伪造

时间:2017-11-03 11:37:58

标签: javascript fingerprint fingerprintjs2

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

我的问题是,如果我通过ajax发送这个值,用户可以轻微伪造这个值,并且只做一个假的帖子请求,它将被服务器代码解释为合法的。

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

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

3 个答案:

答案 0 :(得分:11)

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

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

如果你想要的话,可以使用带有库{2}的服务器端指纹识别来匹配数据,但是你无缘无故地让自己头疼。

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

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

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

所以总之,不要打扰。人们也不会打扰。

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

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

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

答案 1 :(得分:3)

  

我如何确保该值的完整性?

为了简单回答您,无论何时您想要保护您的诚信,您都必须提供已发送邮件的摘要。

在这里,我使用Alice( FrontEnd ),Bob( BackEnd )和Trudy(恶意用户)来解释完整性的防御

<强>假设:

Alice希望向Bob发送包含PLAIN_TEXT(此处为您的指纹)的程序包,而Trudy是希望拦截程序包并更改PLAIN_TEXT的恶意用户

威胁诚信:

Trudy可以捕获PLAIN_TEXT并将其更改为她想要的任何内容。 (实际上可能存在更多针对诚信的威胁,但我希望将故事保持简短。

以下是Alice必须采取的保护包装完整性的步骤:

  1. Alice获取PLAIN_TEXT的摘要(称为text_digest)。
  2. Alice将摘要附加到PLAIN_TEXT,然后获取新的packagepackage = PLAIN_TEXT + text_digest
  3. Alice加密package
  4. Alice获取加密包的摘要(whole_package_digest
  5. Alice将whole_package_digest附加到加密包,并将其发送给Bob
  6. Trudy在接受后可以做什么:

    选项1.尝试破解软件包的加密

    选项2.尝试省略encrypted package并附上自己的包。

    鲍勃的一面:

    1. 他解密package,并获得PLAIN_TEXT。 (他确保Alice发送了这个包,因为没有其他人拥有密钥)

    2. 他使用相同的方法获取PLAIN_TEXT的摘要(让我们调用此obtained_digest),并将obtained_digest与{text_digest进行比较1}},如果它们相等则意味着PLAIN_TEXT不被操纵。

    3. 最后,他获取收到的包的摘要,并将其与whole_package_digest进行比较。如果他们是平等的,那么意味着Trudy已经失败了她的第二个选择。

    4. 请注意,在上述场景中,完整性高度依赖于机密性。但是,您可以使用对称和非对称方法进行加密。

      在下图中,我试图更清楚地解释我想说的内容:

      enter image description here

答案 2 :(得分:0)

检查客户端指纹的完整性是不可能的......你最好的选择是使用PHP来检测内部系统......我为此写了一个库但没有发布......如果你需要它我可以发给你...

这个库的作用是检测设备的Mac地址...由于两个系统不能有相同的Mac地址...这是一个非常好的获取准确指纹的方法。