使用像fingerprint2这样的库在客户端计算JS指纹。
我的问题是,如果我通过ajax发送这个值,用户可以轻微伪造这个值,并且只做一个假的帖子请求,它将被服务器代码解释为合法的。
我的问题是,如果发生这种情况,可以轻松绕过这个库,甚至不用更改浏览器中的任何属性(这将改变浏览器指纹)。
我的解释是对的?我如何确保该价值的完整性?
答案 0 :(得分:11)
你不能,我也不会真的担心它。
规则1:来自用户计算机的所有输入都可以伪造,不能100%依赖。
如果你想要的话,可以使用带有库{2}的服务器端指纹识别来匹配数据,但是你无缘无故地让自己头疼。
90%的用户访问您,不知道您在做什么,并为您提供可靠的数据。他们甚至不会有广告块。他们会为您提供可靠的数据。
9%的访问者可能拥有广告拦截器,这可能会也可能不会阻止这些ajax请求。他们希望您尊重他们的隐私,这样做可以让他们成为客户。 1%的人可能知道这些ajax请求的作用,但他们永远都不会发现,因为他们无法检查他们访问的每个网站的控制台。 1%的1%可能会看一眼浏览器控制台并找出浏览器指纹。
1%的1%中的1%将窃取您的指纹识别码。 1%的1%中的另外1%将尝试为lulz伪造它然后忘记它。
所以总之,不要打扰。人们也不会打扰。
但是,如果你真的必须打扰,并让自己头疼:
gotcha.js?time=1283737273873
再次使用服务器端脚本来拦截。然后,您可以使用ajax更新页面内容。除此之外,我真的可以推荐你:不要打扰。这不值得努力。想要规避的人会规避。他们将禁用javascript,排除该脚本,在继续或离开网站之前清除所有cookie,更改已注册的字体插件等... 不要追逐那些不想被追逐的人。专注于不关心的群体。
答案 1 :(得分:3)
我如何确保该值的完整性?
为了简单回答您,无论何时您想要保护您的诚信,您都必须提供已发送邮件的摘要。
在这里,我使用Alice( FrontEnd ),Bob( BackEnd )和Trudy(恶意用户)来解释完整性的防御
<强>假设:强>
Alice希望向Bob发送包含PLAIN_TEXT
(此处为您的指纹)的程序包,而Trudy是希望拦截程序包并更改PLAIN_TEXT
的恶意用户
威胁诚信:
Trudy可以捕获PLAIN_TEXT
并将其更改为她想要的任何内容。 (实际上可能存在更多针对诚信的威胁,但我希望将故事保持简短。)
以下是Alice必须采取的保护包装完整性的步骤:
PLAIN_TEXT
的摘要(称为text_digest
)。PLAIN_TEXT
,然后获取新的package
(package
= PLAIN_TEXT
+ text_digest
)package
whole_package_digest
)whole_package_digest
附加到加密包,并将其发送给Bob Trudy在接受后可以做什么:
选项1.尝试破解软件包的加密
选项2.尝试省略encrypted package
并附上自己的包。
鲍勃的一面:
他解密package
,并获得PLAIN_TEXT
。 (他确保Alice发送了这个包,因为没有其他人拥有密钥)
他使用相同的方法获取PLAIN_TEXT
的摘要(让我们调用此obtained_digest
),并将obtained_digest
与{text_digest
进行比较1}},如果它们相等则意味着PLAIN_TEXT
不被操纵。
最后,他获取收到的包的摘要,并将其与whole_package_digest
进行比较。如果他们是平等的,那么意味着Trudy已经失败了她的第二个选择。
请注意,在上述场景中,完整性高度依赖于机密性。但是,您可以使用对称和非对称方法进行加密。
在下图中,我试图更清楚地解释我想说的内容:
答案 2 :(得分:0)
检查客户端指纹的完整性是不可能的......你最好的选择是使用PHP来检测内部系统......我为此写了一个库但没有发布......如果你需要它我可以发给你...
这个库的作用是检测设备的Mac地址...由于两个系统不能有相同的Mac地址...这是一个非常好的获取准确指纹的方法。