如何确保客户端请求中的指纹值不被伪造

17

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

我的问题是,如果我通过ajax发送这个值,用户可以轻松地伪造这个值,并且只需进行虚假的POST请求即可被服务器代码解释为合法请求。

我的问题是,如果发生这种情况,即使未更改浏览器属性(以更改浏览器指纹),该库也可以轻松绕过。

我的理解正确吗?如何确保该值的完整性?

3个回答

24

您不能这样做,而且我也不会真的担心。

规则1:从用户计算机发出的所有输入都可以被伪造,并且不能100%依靠。

如果您愿意,可以使用像piwik设备检测器这样的库与服务器端指纹识别配合使用以匹配数据,但这会让自己头疼而没有任何原因。

90%的访问者不知道您在做什么并且会向您提供可靠的数据。他们甚至没有广告拦截程序。他们会给您可靠的数据。

9%的访问者可能有广告拦截程序,这可能会阻止那些ajax请求。他们希望您尊重他们的隐私,这样您才能将其视为客户。1%的人可能知道这些ajax请求所做的事情,但他们永远不会去查看每个网站的控制台。1%的1%可能会看一眼浏览器控制台并了解浏览器指纹识别。

1%的1%的1%会窃取您的指纹识别代码。另外1%的1%的1%会尝试伪造它,只是出于好玩的心态,然后就忘了它。

总之,不要费心。人们也不会费心。

但如果您真的必须费心并给自己带来头疼:

  • 在客户端计算机上以跟踪cookie的形式存储用户ID,并将其存储在会话存储、本地存储和浏览器可能提供的任何数据库引擎中。(当欧洲用户访问您的站点时,请注意在Cookie使用声明中说明为什么要在用户计算机上存储数据)
  • 使用该用户ID匹配指纹识别用户。请注意,此ID可能随时被任何缓存清理机制(如cccleaner、病毒扫描程序、用户单击空历史记录等)删除。
  • 将用户ID放在window.name对象中。只要选项卡打开且被使用,它将持久存在,并尝试重置/保存它在用户计算机上。
  • 在您的图像上添加一个E-TAG,下次用户访问时,用户计算机将尝试使用该ETAG编号请求该图像。拦截该请求(不要让Web服务器处理它,而是在php / jsp / asp /任何其他地方进行处理),以便您可以识别用户。设置正确的用户ID会话变量,并“响应”该图像仍然有效,并使用Cookie返回正确的用户ID。
  • 根据用户ID在javascript请求后面放置“时间戳”值,并将包含该javascript文件的请求页面设置为在180天左右过期。每次用户返回并且用户未清除其历史记录时,它都会使带有给定“时间戳”查询参数的javascript请求获取gotcha.js?time=1283737273873使用服务器端脚本再次拦截。然后,您可以使用ajax更新页面内容。
  • 在您的页面上包含类似于Google Maps的东西。如果他们使用Gmail或任何Google服务,并且他们同意Google设置Cookie,则Google会向其浏览器转储Cookie,这些Cookie可能会持续一段时间。 Google地图Cookie至少在浏览器会话期间保持不变,并可由JavaScript /服务器端脚本读取。
  • 使用Piwik设备检测器构建服务器端浏览器指纹,用它来缩小对用户的猜测。
  • 对请求进行编码,作为字节缓冲区/流,并将其Base64编码以使猜测更困难,即使他们对其进行Base64解码并将请求分成两部分,一部分带有验证哈希值,一部分带有指纹。然后匹配哈希和内容,如果匹配,您可以确定如果欺骗,则需要付出很大的努力.
  • 压缩和混淆您的代码,在JavaScript代码中添加许多无用的辅助功能。将每行放入其自己的函数中并将它们链接在一起以形成一个连贯的整体。让人难以推断出发生了什么。
  • 除此之外,我真的建议您:不要费心。这不值得花费那么多的精力。想要规避的人会规避。他们会禁用JavaScript,排除该脚本,在继续或离开网站之前清除所有Cookie,更改注册的字体插件等等...

    不要追逐那些不希望被追求的人,集中精力关注那些并不在意的群体。

    1
    很棒的回答,但您能帮我理解服务器端指纹识别是如何工作的吗?它们拥有与客户端相同的数据意义是什么,只是可能会运行一些复杂的算法来检测数据集是否可疑? - ishandutta2007

    3
    如何确保这个值的完整性?
    简要回答是,每当你想保护你的完整性时,必须提供所发送消息的摘要。
    下面是使用Alice(前端), Bob(后端)和Trudy(恶意用户)来解释完整性防御的内容:
    假设:Alice想将包含PLAIN_TEXT(指纹)的数据包发送给Bob,而Trudy是想截获包并更改PLAIN_TEXT的恶意人士。
    针对完整性的威胁:
    Trudy可以捕获PLAIN_TEXT并将其更改为任何她想要的(在现实中可能还有其他针对完整性的威胁,但我希望故事简短)。
    以下是Alice必须采取的步骤以保护程序包的完整性:
    1.Alice获取PLAIN_TEXT的摘要(称为text_digest)。
    2.Alice将摘要附加到PLAIN_TEXT上,并获取一个新的package(package=PLAIN_TEXT+text_digest)
    3.Alice对package进行加密。
    4.Alice获取加密Package的摘要(whole_package_digest)。
    5.Alice将整个包的摘要附加到加密的包中,并将其发送给Bob。
    Trudy拦截后的选项:
    1.尝试打破包的加密。
    2.尝试省略加密包并附加自己的包。
    Bob方面:
    1.他解密package,获取PLAIN_TEXT(他确认Alice发送了这个package,因为没有人有密钥)。
    2.他使用相同的方法获取PLAIN_TEXT的摘要(称为obtained_digest),并将obtained_digest与text_digest进行比较,如果它们相等,则意味着PLAIN_TEXT未被操纵。
    3.最后,他获取接收包的摘要,并将其与whole_package_digest进行比较。如果它们相等,则说明Trudy在第二个选项上失败了。
    请注意,在以上情况下,完整性高度依赖于机密性。但是,您可以同时使用对称和非对称方法进行加密。
    在下面的图片中,我试图更清楚地解释我想要说的内容:

    enter image description here


    2
    你的回答超出了问题提问者的要求。这个问题不仅仅是关于数据拦截,更多的是如何获取准确的浏览器指纹,而不被用户操纵或篡改,以免被用于广告追踪和用户数据跟踪等目的。 - Tschallacka
    1
    @Tschallacka 我认为上面的解决方案会起作用,因为伪造者不知道创建哈希的公式,即散列字符串是明文+盐还是盐+明文或某些盐+明文+盐。 - Arpita
    1
    @Arpita 数据来自用户的浏览器。用户可以使用浏览器插件来改变已注册的字体、插件等,或者更改浏览器版本/代理ID,从而使浏览器指纹不可靠。这就是OP所问的问题。不是关于中间人攻击的问题。OP想要确保他/她得到的指纹可靠,以便用于跟踪用户/识别用户,并且用户不会伪造浏览器提供的信息,以便OP能够可靠地识别用户以提供广告、交易或其他定制服务。 - Tschallacka
    1
    @Arpita 我也理解你的问题。对我来说,它们是一样的。无论是中间人攻击还是用户使用一些技巧更改某些值。重要的是保护数据的完整性。无论何时何地,无论谁威胁到它。 - Sal-laS
    1
    @Salman,你正在用户计算机上运行代码。完整性已经失效了。用户对他的计算机拥有完全控制权,他可以轻松地通过一根手指重放所有这些请求。只需在Chrome中进入网络,点击xhr,您就可以看到发送的所有标头和数据,他甚至可以简单地重放相同的信息,甚至可以点击多个页面以产生一些变化并将其作为噪音发送。进入调试器模式,他可以轻松跟踪您的JavaScript哈希点。没有数据完整性。不要关注那些想要干扰的人,而是关注那些不关心的人。指纹和cookie = 不可靠。 - Tschallacka
    显示剩余5条评论

    0

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

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接