原文地址:Crooked Style Sheets
做者:jbtronicsphp
除了使用 JS 追踪用户,如今有人提出了还可使用CSS 进行网页追踪和分析
,译者认为,这种方式更为优雅
,更为简洁
,且很差屏蔽
,值得尝试一波,了解更多,可查看 仓库地址 和 demo
咱们能够收集关于用户的一些基本信息,例如 屏幕分辨率
(当浏览器最大化时)以及用户使用的什么浏览器
(引擎)css
此外,咱们能够监测用户是否点击某个连接或鼠标悬停在某个元素上,用来 追踪用户悬停的连接
,甚至能够 追踪用户如何移动鼠标
(在页面使用不可见的字段),然而,使用目前个人方法只能追踪用户的第一次点击或悬停,我相信,修改个人方法最终能够实现追踪用户的每次点击html
最后,咱们还能够监测用户是否安装了某个特殊的字体,基于这个信息,咱们能够追踪用户使用的 操做系统
,由于不一样操做系统使用的字体也稍有不一样,例如 Windows
的 Calibri
git
用 CSS
你可使用 url("foo.bar")
属性引用外部资源添加图像,有趣的是,这个资源只在须要的时候被加载(例如,当连接被点击时)github
因此,咱们能够用 CSS
建立一个选择器,当用户点击某个连接时调用某个特定的 UPL
web
#link2:active::after { content: url('track.php?action=link2_clicked'); }
服务端,php
脚本会在调用 URL
时保存时间戳chrome
浏览器监
测是基于 @supports Media-Query
的,咱们能够监测浏览器的一些特殊的属性
,例如 -webkit-appearance
浏览器
@supports (-webkit-appearance: none) { #chrome_detect::after { content: url('track.php?action=browser_chrome'); } }
对于 字体监测
,须要定义一个新的字体,若是一个字体存在,文本会尝试使用该字体进行样式设置,然而,当用户在系统上找不到该字体时,定义的字体会做为备用,在这种状况下,浏览器会尝试去加载定义的字体并在服务器上调用追踪脚本服务器
/** Font detection **/ @font-face { font-family: Font1; src: url('track.php?action=font1'); } #font_detection1 { font-family: Calibri, Font1; }
对于 悬停监测
(基于 jeyroik 的想法),咱们需定义一个关键帧,每次使用这个关键帧都要去请求一个 URLapp
@keyframes pulsate { 0% { background-image: url('track.php?duration=00'); } 20% { background-image: url('track.php?duration=20'); } 40% { background-image: url('track.php?duration=40'); } 60% { background-image: url('track.php?duration=60'); } 80% { background-image: url('track.php?duration=80'); } 100% { background-image: url('track.php?duration=100'); } }
而后,咱们使用定义的关键帧建立动画,咱们能够定义动画持续的时间,这也是咱们测量的最大时间
#duration:hover::after { -moz-animation: pulsate 5s infinite; -webkit-animation: pulsate 5s infinite; /*animation: pulsate 5s infinite;*/ animation-name: pulsate; animation-duration: 10s; content: url('track.php?duration=-1'); }
咱们能够经过补充关键帧的设置,来优化分辨率的监测
监测用户选中了某个复选框,咱们可使用 CSS
提供的 :selected
选择器
#checkbox:checked { content: url('track.php?action=checkbox'); }
为了监测字符串,咱们结合了 HTML pattern
属性,它能够帮助咱们解决一些基本的输入验证,再结合 :valid
选择器,浏览器当输入匹配成功时会去请求咱们的追踪站点
<input type="text" id="text_input" pattern="^test$" required>
#text_input:valid { background: green; background-image: url('track.php?action=text_input'); }
点击 这里 你能够查看该仓库的一个 demo。index.html
实践了的上述的方法,访问 results.php
能够查看结果
若是属性后面没有任何 content
或有 php 警告
出现,这就意味着这个属性的值为 false
或用户还没访问页面或连接(这个,确实很烦,但你能够知道这些方法的原理)
此外,分辨率监测还不是特别的准确,由于目前只能监测最经常使用的屏幕宽度。最后还想说的是,监测用户实际屏幕的宽度并无想象中的那么简单,由于 CSS
监测的高度为浏览器窗口的高度,而一般因为系统面板 / 任务栏的缘由,使得浏览器窗口要小于显示器
目前我知道的惟一办法就是 彻底禁用 CSS
(你可使用像 uMatrix 的插件来实现),但它的代价也是十分巨大的,没有 CSS,网页就没有以前那么赏心悦目了,甚至致使没法正常使用,因此,禁用 CSS 算不上一个真正的选择
,除非,你实在担忧你的隐私(例如,当你在使用 Tor 浏览器,也许你应该禁用 CSS)
一个更好的解决方案是,在网页加载时,浏览器不会去加载须要的外部资源
,这样,就不可能监测到用户的我的行为,这种对内容加载的修改能够经过浏览器来实现,也能够经过插件来实现(相似 NoScript 或 uMatrix)
上述方法也存在一个明显的问题,那就是 对性能会形成必定的影响,
由于浏览器会在初始化页面时加载大量的内容(有些内容是页面根本不须要的)