如何禁用特定css_通过CSS追踪用户
2018年初,一个物理专业的学生Jan Böhmer创建了一个网站,用来跟踪和记录用户的点击、鼠标移动、浏览器类型和操作系统等数据。虽然用户跟踪并不新鲜,但他的方法不需要JavaScript、插件或外部库。实际上,它只使用了普通HTML文本和一点CSS。
它是如何工作的
Böhmer的概念利用了CSS的两个特性:将内容注入HTML元素的能力,以及在用户执行操作后更改样式的能力。网站的工作方式是在执行操作时使用content属性设置URL。此URL调用一个脚本,该脚本记录有关操作的详细信息,这些操作作为URL参数进行传递。使用::before和::after CSS选择器设置这个URL可以确保只在执行操作时调用URL,而不是在页面首次加载时调用URL。
例如,下面的CSS在每次单击#link元素时调用一次URL:
跟踪脚本包含记录事件和操作执行次数的代码。它还可以用于提取用户的IP地址、用户代理和其他标识信息。
下面是这样一个脚本在PHP中的示例:
检测浏览器类型
用户可以欺骗浏览器的用户代理,但是 Böhmer绕过了这个问题,他使用@supports at-rule(at-rule 是CSS样式声明,以@开头,紧跟着是标识符(charset),最后以分号(;)结尾。)测试浏览器特定的CSS属性。例如,下面的操作通过检测--webkit-appearance是可用的,而-ms-ime-align是不可用的来检测Chrome浏览器:
检测操作系统
Böhmer甚至使用字体检测来识别用户的操作系统。例如,通过检测浏览器是否支持Calibri字体家族,我们可以假定浏览器运行在Windows中:
Böhmer关于此概念的验证可以识别其他数据点,包括浏览器窗口的大小和方向、用户是否单击了链接以及用户在一个元素上停留的时间。
这种攻击在浏览器中非常难以预防。完全防止它的唯一方法就是禁用CSS,这会使网站无法使用。然而,通过使用内容安全策略(CSP),可以减少攻击者利用此漏洞的机会。
使用内容安全策略减少CSS泄漏
CSP是一组规则,它决定浏览器可以执行哪些操作,不能执行哪些操作。CSP通常用于防止跨站脚本攻击(XSS)和由浏览器加载不信任脚本导致的其他攻击。虽然CSP通常用于JavaScript文件,但它也可以应用于CSS样式和样式表。
考虑一个使用第三方提供商托管的样式表的网站。攻击者破坏样式表并将用户跟踪代码添加到页面上的链接:
当用户点击该链接时,他们的浏览器调用evil.com上托管的跟踪脚本。由于这完全是通过浏览器完成的,网站所有者完全不知道这个漏洞。
Content-Security-Policy通过设置允许哪些样式以及样式来源等规则来防止这种情况。
禁用内联样式
禁用内联样式是CSP提供的最大安全好处之一。内联样式是直接在HTML文档中声明的样式(或使用JavaScript设置的样式),而不是从样式表加载的样式。内联样式——尤其是动态生成的样式或用户创建的样式——非常难以保护。这就是为什么CSP通常会锁定所有内联脚本和样式,并将那些已被特别批准的内联脚本和样式列入白名单。
以下规则将阻止所有内联样式以及外部托管的样式表:
使用Hash和Nonce验证样式
如果阻塞内联样式是不可行的,你仍然可以使用hash和nonce来确保CSS的完整性。
Hash是由一个文件或字符串的内容生成的单向字符串。在样式表或内联样式上执行哈希函数时,除非样式发生改变,否则它总是返回相同的结果。这对于将某些内联样式和样式表加入白名单是很有用的,只需要同时验证样式没有被修改或篡改。
Nonce的功能与hash类似。使用nonce,将为每个请求生成一个新的随机数,这使得攻击者更难猜测它的值。这避免了hash的一个关键缺点,即多个输入可能生成相同的hash值(称为冲突)。
验证外部托管的样式表
样式表通常托管在第三方服务器上,如内容交付网络(content delivery networks, CDNs),但这带来了新的攻击方向。如果CDN受到威胁,如何阻止攻击者用自己修改过的版本替换样式表?子资源完整性,也叫SRI,试图解决这个问题。
SRI使用hash值来验证脚本和样式表的内容。计算每个文件的hash值,并将其附加到HTML元素的integrity属性中。当浏览器下载脚本或样式表时,计算其hash值并将其与存储在属性中的值进行比较。如果匹配,浏览器将加载脚本或样式。
这是在假设web页面是从受信任的源(如源服务器)提交的情况下运行的,而当资源是从不受信任的源(如第三方)提交的时候,就无法正常运行。如果web页面和资源都由第三方托管,攻击者只需要简单地修改web页面来匹配其CSS替换文件的hash值即可。
结论
虽然通过CSS跟踪用户的能力并不新鲜,但它确实要求我们以不同的方式考虑网页上的隐私和安全性。CSS是现代网页的基本语言之一,禁用网站的CSS将使网页的大部分内容无法使用。内容安全策略是阻止XSS攻击和CSS泄漏的最佳方法。Templarbit创建了一个“灵活的内容-安全-策略工作流”,以便于维护CSP头文件。如果你的团队正在努力为你的应用程序推出CSP,请立即注册一个免费试用版,并学习更多关于Templarbit如何解决CSS泄露的方法.
你可以在GitHub上找到Böhmer的概念验证的源代码。
相关连接:
网站——http://crookedss.bplaced.net/
最大的安全好处——https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src#Unsafe_inline_styles
通常锁定所有内联脚本——https://developers.google.com/web/fundamentals/security/csp/
加入白名单——https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src
并不新鲜——https://www.smashingmagazine.com/2014/10/css-only-solution-for-ui-tracking/
现在就注册获取免费版——https://www.templarbit.com/signup
GitHub——https://github.com/jbtronics/CrookedStyleSheets
相关知识:
SRI,Subresource Integrity 的缩写,中文:子资源完整性,由 Web 应用安全工作组(Web Application Security Working Group)发布。
英文原文:https://www.templarbit.com/blog/2018/03/20/tracking-users-with-css/
译者:忧郁的红秋裤
如何禁用特定css_通过CSS追踪用户相关推荐
- 使用 CSS 追踪用户
通过css追踪,就可以在用户禁止Js后,依然能够拿到自己想要得到的用户的操作信息,(不知道会不会有调皮的前端工程师,偷偷来拿用户信息,隐私?) 总结德国学生Jan Böhmer的github上的文章和 ...
- oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?
从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE).这些系统级别的触发器包括数据库启动触发器 ...
- oracle用户的追踪文件,Oracle中怎样通过触发器来追踪用户的活动?
从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE).这些系统级别的触发器包括数据库启动触发器 ...
- SAP 查询系统日志- 追踪用户的更改记录
SAP 查询系统日志-追踪用户的更改记录 技术相关 2020/06/30 09:14 107 1.STAD 提供了跨业务交易的工作负载统计信息,但该事务代码只能查找最近两天的记录,而且只能查询24 ...
- 谷歌Chrome浏览器添加新技术 可防止广告主追踪用户
谷歌chrome浏览器添加新技术 可防止广告主追踪用户 据美国科技媒体ZDNet报道,谷歌Chrome提出一套新的技术解决方案,目的是想调和用户隐私与广告投放之间的矛盾. 新方案名叫Privacy S ...
- 使用 CSS 接收用户的点击事情并对相关节点进行操作
问题背景:使用纯 CSS 方案,实现导航栏tab切换 实现 Tab 切换的难点在于如何使用 CSS 接收到用户的点击事情并对相关的节点进行操作.即是: 如何接收点击事件 如何操作相关DOM 下面看看如 ...
- C++之禁用特定告警
禁用特定告警,可以在界面配置: 或者在代码里面控制: #pragma error(disable:4996) //全部禁用 #pragma warning(disable:4996)
- vue用户行为收集_Vue前端数据采集 埋点 追踪用户系列行为
埋点分析,是网站分析的一种常用的数据采集方法.数据埋点分为初级.中级.高级三种方式.数据埋点是一种良好的私有化部署数据采集方式. 埋点技术如何采集数据,有何优缺点? 数据埋点分为初级.中级.高级三种方 ...
- 如何用网页脚本追踪用户
>>如何用网页脚本追踪用户 >>Beacon API 使用
最新文章
- c++构造函数用法一
- DCMTK:OFUUID测试程序
- Windows10家庭中文版没有本地策略选项完美解决方案
- git原理浅析及命令介绍
- 嵌入式BootLoader技术内幕(二)
- Vue2.0 脚手架代码详解
- 诗和远方:无题(五十三)- 曾经写给一个妹子的诗
- python 时间戳_Python打牢基础,从19个语法开始!
- Java线程间通信方式
- python按字节读文件-使用Python进行二进制文件读写(转)
- 楼天成 中国大学生编程第一人
- Android开源项目第一篇——个性化控件(View)篇
- 网络云存储技术Windows server 2012 (项目十六 基于iSCSI传输的配置与管理)
- 【战神引擎】设置GM管理员账号
- keil中更改stm32芯片类型需要修改的配置
- 解决SimpleDateFormat线程不安全问题
- 【cojs1487】麻球繁衍
- 【JavaEE进阶系列 | 从小白到工程师】JavaWeb中的过滤器(Filter)和监听器(Listener)区别,看这一篇就够
- 弘辽科技:抖音最大对手,有了新变化
- 解决Hive中出现 Display all 528 possibilities? (y or n)错误
热门文章
- 手机活动促销宣传海报,如何设计更有吸引力?
- 优秀PSD电商促销BANNER模板|垂直化内容电商页面设计,需要注意哪些问题?
- 一只青蛙跳向三个台阶_青蛙跳台阶问题的三种解法
- Linux-5.10.13内核完全注释之工作队列
- Linux iperf 网络传输性能测试工具
- Django:cmd虚拟环境及第一个project、Pycharm虚拟环境及第一个project、Not Found favicon.ico、Windows命令行创建虚拟环境、Django版本选择
- uwsgi+django在ubuntu下命令部署亲测ok
- arraylist、map、queue、stack总结
- tomcat虚拟盘符映射
- androidwear的主要UI空间有哪些