网站指纹识别技术令人担忧。它指的是收集足够多的用户元数据,从而识别用户身份。JavaScript 提供了各种指纹识别可能性,结合服务器访问的IP地址,使得指纹识别变得非常普遍。
然而,人们通常不会将CSS视为指纹识别的媒介,因此认为它在某种程度上是“安全的”。但Oliver Brotchie 提出了一种仅使用CSS进行一定程度指纹识别的方案。
考虑一下我们拥有的所有@media
查询。我们可以使用any-pointer
测试指针类型。想象一下,对于每个值,我们都从服务器请求一个完全唯一的背景图像。如果请求了该图像,我们就知道了这些@media
查询为真。我们可以用类似这样的方法开始进行指纹识别:
.pointer { background-image: url('/unique-id/pointer=none') } @media (any-pointer: coarse) { .pointer { background-image: url('/unique-id/pointer=coarse') } } @media (any-pointer: fine) { .pointer { background-image: url('/unique-id/pointer=fine') } }
结合我们可以使用prefers-color-scheme
测试暗模式偏好的事实,指纹识别就更加清晰了。事实上,Oliver 最关注的是当前CSS用户首选项媒体查询的草案:
即将发布的草案不仅使这种方法具有可扩展性,而且还会提高其精度。目前,如果没有其他方法,很难将每个请求最终与特定访问者联系起来,因为确定其来源的唯一可行方法是按连接的IP地址对请求进行分组。但是,使用新的草案,通过生成一个随机字符串并将其插入每个访问者的URL标签中,我们可以准确识别该访问者的所有请求。
还有更多方法。我们可以创建相隔1像素的媒体查询,并为每个查询请求一个背景图像,从而完美地猜测访问者的窗口大小。可能还有十几个鲜为人知的奇特媒体查询,但它们对于使用CSS进行指纹识别非常有用。将其与各种@supports
查询结合使用,可以有效地猜测确切的浏览器。再结合测试特定本地字体安装的经典技术,你就可以得到一个相当不错的指纹识别机器。
@font-face { font-family: 'some-font'; src: local(some font), url('/unique-id/some-font'); } .some-font { font-family:'some-font'; }
生成的CSS代码量很大(这是生成它的Sass代码),但显然一旦我们可以在URL中使用自定义属性,它就会大大减少。
我并不太担心这个问题,主要是因为我没有禁用JavaScript,而JavaScript已经具备更广泛的指纹识别能力。此外,已经存在其他类型的CSS安全漏洞,例如读取已访问链接(浏览器已解决)、按键记录和用户生成的内联样式,以及其他一些人在另一篇文章中指出的内容。
但是,Oliver关于指纹识别的研究非常出色,值得所有比我更了解网络安全的人关注。
以上是基于CSS的指纹的详细内容。更多信息请关注PHP中文网其他相关文章!