深究 :visited 和隐私安全那点事

简介: 好久前码代码时,想将网页上已阅读的链接做些特殊的样式处理,然而发现很多事情做不了,当时做了下笔记,这里整理下。

微信截图_20221018133657.png

好久前码代码时,想将网页上已阅读的链接做些特殊的样式处理,然而发现很多事情做不了,当时做了下笔记,这里整理下。

现象

a 标签的 :visited 伪类用于指定被访问过的链接的样式,一般我们会针对 :visited 设定标签的字色、背景色等。尝试过的可能知道,针对其设定高度、字号等都无法生效。可能你会觉得哪里写错了(我一开始就是这么以为的),但不用怀疑,不是你的锅,而是浏览器限制了伪类的功能。

可尝试以下代码:

<a class="lure-link" href="https://github.com"></a>
<style>
    .lure-link {
        color: green;
        line-height: 20px;
    }
    .lure-link:visited {
        color: red;
        line-height: 30px;
    }
</style>
复制代码

会发现链接颜色变化了,但行高却没变化。

其实并不只是 css 上的限制,连 js 也同样设了限制。

getComputedStyle(document.querySelector('.lure-link')).color;
复制代码

会发现返回的是 green,而不是 red。

微信截图_20221018133858.png

好家伙,眼见为虚,不知道的还以为红绿色盲了。

原因

为什么 :visited 伪类这么特殊,只能设定很少的部分样式?这主要是出于安全性考虑。

:visited 是一个特殊的伪类,他会给用户展示告诉客户该连接是否访问过,如果访问过,那么它就会按照 :visited 的设定来显示。

那就会造成一定的风险:假设现在有个网站,他隐藏了一个不可见的链接,然后设定该链接的 :visited 样式:

<a class="lure-link" href="https://xxxhub.com"></a>
<style>
    .lure-link {
        display: block;
        width: 0;
        height: 0px;
        visibility: hidden;
    }
    .lure-link:visited {
        height: 1px;
    }
</style>
复制代码

然后呢他悄摸摸的写了段脚本:

const visited = getComputedStyle(document.querySelector('.lure-link')).height === '0px';
report(userId, visited);
复制代码

好家伙,你访问某某 hub 的事情败露了,emm,别人一看,这家伙肯定是个爱学习的仔(别误会,我说 Github)。

微信截图_20221018133931.png

所以呢浏览器直接把 :visited 的这些样式取消了,那为啥保留了颜色这类样式呢?不是一样会暴露吗?

其实当你使用 js 获取 :visited 链接的颜色时,获取到的是未应用 :visited 规则的样式。

那为啥不对其它非颜色样式做同样的事情,css 生效,但是 js 获取的时候,返回的是未应用 :visited 规则的样式呢?

因为其它大部分样式会影响到别的元素的展示,比如如果高度变化,那它的容器高度就会发生变化,攻击者依旧可以使用别的方法去获取链接的状态,比如父元素的高度或者兄弟元素的偏移位置等。

所以浏览器为了你的隐私考虑,不得不对 :visited 做出诸多限制。毕竟爱学习这种事情,不能随便暴露。

具体限制

CSS 中的限制

  • CSS 中 visited 只能设置如下几个样式:
  • color
  • background-color
  • border-color
  • outline-color
  • column-rule-color
  • text-decoration-color
  • text-emphasis-color
  • fill、stroke 相关的颜色
  • 可以看到,全是颜色值。
    并且上述值不可使用带透明度的颜色,如 transparent、rgba(0,0,0,0.5) 等,透明度都会被忽略。具体原因并没有找到相关文献,网络上有猜测和 pixel perfect timing attack 相关,猜测是因为透明度会影响渲染时间(颜色混合),然后攻击者可以通过时间差来猜测是否应用了透明色从而得出链接的状态。
    微信截图_20221018133858.png
    至于为什么要禁止背景图片,因为背景图会发送请求,连 JS 都不用写就直接给你上报上去了。如:
a.xxxhub:visited {
    background-image: url(/log/visited/xxxhub);
}
复制代码
  • 并且,使用使用 :visited 做兄弟选择器时是无效的,比如:
a:visited + span {
    color: red;
}
复制代码
  • 会发现不会生效。
  • 而用作父子/后代选择器时,则同样只能生效上述颜色类的样式。
a:visited span {
    color: red;
    font-size: 20px; // 不会生效
}
复制代码

JS 中的限制

这些限制不仅包括链接元素,也包括使用 visited 伪类做父子/后代选择器应用的样式

  • getComputedStyle 获取的样式不会应用 :visited 规则
    类似上面提到的,看着是红的,浏览器却告诉你,真的绿了。(emm 没别的意思)
  • element.querySelector 时不会应用 :visited 选择器
    为了防止攻击者从获取的元素中获取到 :visited 链接。

其它

:visited 相关的漏洞其实是 2010 年才修复的,所以如果你有幸穿越回到 2010 年前,千万记得学习后要清空浏览器缓存记录。

相关文章
|
10月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
1035 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
7月前
|
机器学习/深度学习 人工智能 并行计算
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
|
机器学习/深度学习 存储 搜索推荐
连续迁移学习跨域推荐排序模型在淘宝推荐系统的应用
本文探讨了如何在工业界的连续学习的框架下实现跨域推荐模型,提出了连续迁移学习这一新的跨域推荐范式,利用连续预训练的源域模型的中间层表征结果作为目标域模型的额外知识,设计了一个轻量级的Adapter模块实现跨域知识的迁移,并在有好货推荐排序上取得了显著业务效果。
1269 0
连续迁移学习跨域推荐排序模型在淘宝推荐系统的应用
【开发课堂】支付宝小程序里如何使用自定义字体?
前言在小程序中为确保移动终端的通用性,官方是建议首选 PingFang SC 作为中文字体,以兼顾 Web 版和 Mobile 端。设计中字体大小与使用场景规范如下:在通配样式里字体如下:{font-style: normal;font-weight: normal;font: 0.
4348 11
【开发课堂】支付宝小程序里如何使用自定义字体?
|
应用服务中间件 网络架构
kodexplorer私有云本地部署,低成本内网穿透教程
可搭建:网站或个人博客;类似于某云的网盘;远程路由器(等家电)控制,内网的服务穿透至外网;迅雷远程下载;家庭云存储中心等。准备工作: 1、 可以插U盘的路由器(推荐二手小米mini,40包邮不能再多了) 2、 将路由器刷为最新的老毛子固件(参见恩山无线论坛) 3、 掏钱买VPS或者寻找一个免费的FRPS服务器 搭建步骤简述: 1、 路由器,联网,插U盘(事先格式化为EXT4格式,可以用diskgenius免费版)。
6970 1
第三方应用授权URL详解
第三方应用授权注意事项:[url]https://openclub.alipay.com/read.php?tid=14575&fid=68[/url] 第三方调用过程中,获取应用授权URL方式有2种(调用过程中选择其中1个): 一、应用授权URL拼接 1、应用授权URL拼接规则 拼接规则:[url]https://openauth.
1873 12
服务器租用IDC单线、双线和BGP线路的区别?
服务器租用IDC的单线、双线和BGP线路有什么区别?服务器百科网分享: 单线、双线和BGP线路的区别 什么是单线? 顾名思义,单线就是指服务器网络为单一线路。比如:电信或者网通,单线是指要么是电信线路,要么是网通线路。
2823 1
|
JavaScript C# Web App开发
C# 用XiliumCefGlue做浏览器,JS和C#相互调用
原文:C# 用XiliumCefGlue做浏览器,JS和C#相互调用 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.
2635 0
C# 用XiliumCefGlue做浏览器,JS和C#相互调用
|
新零售 搜索推荐 关系型数据库
恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计
标签 PostgreSQL , 标签 , 推荐系统 , 实时圈人 , 数组 , gin , gist , 索引 , rum , tsvector , tsquery , 万亿 , user , tag , 淘宝 背景 推荐系统是广告营销平台的奶牛,其核心是精准、实时、高效。
7080 1