CSS :visited 将迎来与隐私相关的变更

有关此问题的更多信息,请查看 David Baron 的文章错误报告 以及 安全博客上的文章

多年来,CSS :visited 选择器一直是查询用户访问历史的一种途径。它本身并不特别危险,但当它与 JavaScript 中的 <a href="https://mdn.org.cn/en/DOM/window.getComputedStyle">getComputedStyle()</a> 组合使用时,就意味着有人可以遍历你的访问历史并找出你访问过哪些网站。而且速度很快 - 一些测试表明 每分钟可以测试 210,000 个 URL。以这种速度,可以暴力破解你的大量访问历史,或者至少通过 指纹识别确定你的身份。考虑到浏览器通常会长时间保存访问历史,它可以揭示你在网络上访问过的大量信息。

在 Mozilla,我们非常重视保护用户的隐私,因此我们将为我们的用户解决这个问题。为此,我们将对 Firefox 中 :visited 的工作方式进行更改。我们还不确定这将在哪个版本中发布,并且修复程序仍在进行代码审查,但我们希望尽快让大家了解我们如何解决这个问题。

这些更改会对网站和开发者产生一些影响,因此您应该了解它们。以下是更改的总体情况

  • getComputedStyle(以及类似的函数,如 querySelector)将撒谎。它们将始终返回用户从未访问过该网站的值。
  • 您仍然可以对已访问的链接进行视觉样式设置,但您可以使用的样式受到严格限制。我们限制了可用于设置已访问链接样式的 CSS 属性,仅限于 <a href="https://mdn.org.cn/en/CSS/color">color</a><a href="https://mdn.org.cn/en/CSS/background-color">background-color</a><a href="https://mdn.org.cn/en/CSS/border-top-color">border-*-color</a><a href="https://mdn.org.cn/en/CSS/outline-color">outline-color</a> 以及 <a href="https://mdn.org.cn/en/SVG/Tutorial/Fill_Stroke_and_Gradients">fill</a><a href="https://mdn.org.cn/en/SVG/Tutorial/Fill_Stroke_and_Gradients">stroke</a> 属性的颜色部分。对于已访问链接样式的任何其他部分,将使用未访问链接的样式。此外,对于上面列出的您可以更改的属性,您将无法设置 rgba()hsla() 颜色或 <a href="http://www.w3.org/TR/css3-color/#transparent">transparent</a>

这些都是使用广泛且非常明显的案例。选择器的工作方式也有一些细微的变化

  • 如果您使用同级选择器(组合器),如 :visited + span,则 span 将被设置为链接未被访问时的样式。
  • 如果您使用嵌套的链接元素(很少见),并且匹配的元素与正在测试其在访问历史中是否存在的状态的链接不同,则该元素也将被绘制为链接未被访问时的样式。

最后两个有点令人困惑,我们将在另一篇文章中提供示例。

对 Web 开发人员的影响应该很小,这也是我们的目标之一。但有一些领域可能需要更改站点

  • 如果您使用 背景图片 来设置链接样式并指示它们是否已被访问,那么这将不再起作用。
  • 我们不支持与已访问状态相关的 CSS 过渡。网络上 CSS 过渡内容不多,因此这不太可能影响很多人,但它仍然值得注意,因为它是我们不支持的另一种途径。

我们希望了解更多关于您如何使用 CSS :visited 以及它将对您的网站产生什么影响的信息。如果您发现某些内容会导致某些功能中断,我们至少希望将其记录下来。请在此处留下评论,提供更多信息,以便其他人也能看到。


176 条评论

  1. […] Blizzard 对 David Baron 的文章、错误报告以及安全博客上讨论 :visited 的文章进行了很好的总结 […]

    2010 年 3 月 31 日 22:02

  2. […] 较早的文章 […]

    2010 年 4 月 12 日 11:41

  3. Daniel

    这很有趣,因为我最近才读过一篇描述这种 CSS 攻击如何工作的文章,而且我刚开始使用这个开发者预览版,所以我很高兴看到这个(尽管我怀疑我认识的人中没有人会知道如何做到这一点)。

    2010 年 4 月 17 日 08:21

  4. Alex

    CSS 渐变呢?

    2010 年 4 月 21 日 12:03

  5. Nikke

    就我个人而言,我能理解为什么 getComputedStyle 需要撒谎。但我无法理解为什么样式的可能性需要受到限制。

    这有点令人沮丧,因为我经常通过将已访问链接的 opacity 降低一小部分来解决区分已访问链接和未访问链接的问题,而不是完全替换颜色。这样就可以为所有链接设置一个全局规则,无论一个文档中是否有不同颜色的链接。

    隐私保护总是受欢迎的,但它不应该以过高的代价为代价。

    2010 年 4 月 21 日 21:23

  6. Shivanand Sharma

    我同意 Nikke 的观点。如果我们让 getComputedStyle 撒谎,那么我们就不应该减少 CSS 的功能。此外,这应该只在“隐私浏览模式”下实现。

    如果我们要追查这些隐私问题,最终会开发出一个只有“隐私浏览”模式的浏览器,因为有太多隐私和安全问题,而且每天都在增加。

    2010 年 4 月 23 日 16:37

    1. Christopher Blizzard

      Shivanand -

      仅仅让 getComputedStyle() 撒谎是不够的。您还必须防止对元素设置任何属性,这些属性会更改其样式,以便可以通过测量另一个元素来检测更改。这就是为什么颜色是您可以更改的唯一内容 - 它们不会更改大小。所有框更改都会以可以快速测量的方式影响布局,因此不允许它们。

      2010 年 4 月 23 日 17:20

      1. Matti Schneider-Ghibaudo

        是的,我考虑过框大小测量……但为什么禁止修改背景图片或不透明度?这将是一个很好的方法,例如仍然能够为用户提供漂亮的复选框 :)

        2010 年 5 月 17 日 02:18

        1. Shaun Spiller

          我不确定不透明度,但必须阻止背景图片。否则,您可以执行以下操作
          a.somedomain.com:visited {
          background: url(/logvisited?somedomain.com);
          }
          这甚至不需要 JavaScript 即可抓取 URL。

          2010 年 5 月 21 日 16:57

          1. Matti Schneider-Ghibaudo

            我明白了,你说得对。
            好吧,还有什么更好的方法:不允许更改背景,但仍然允许背景定位。这样,我们仍然可以为背景设置填充和精灵图,并且仅为已访问的链接更改背景位置,从而仅在那里显示复选框或任何内容 :)

            2010 年 5 月 25 日 11:49

        2. Mathieu

          因为恶意脚本可以从服务器端脚本知道何时调用特定 URL,并且每个唯一的 URL 都会有自己的“background-url”属性。不知道这是否清楚。

          2010 年 5 月 24 日 17:21

  7. Christopher Blizzard

    我还要指出,已将与我们对 Gecko 所做的更改相同的更改签入 WebKit。因此,此更改很快就会出现在所有浏览器中。

    2010 年 4 月 23 日 17:21

  8. Cyrus Omar

    是否可以以某种方式使用 canvas/SVG 来映射元素,然后抓取光栅化的像素?

    2010 年 4 月 26 日 19:28

  9. mauro

    但是您仍然可以为所有链接(除了已访问的链接)添加 1px 填充,然后使用 getComputedStyle(如果它返回空字符串,则表示已访问)

    您不能让 :link 样式也应用于 :visited 吗?这样你就无法为它们创建不同的样式

    如果您将轮廓添加到 :visited 的支持样式中,那就太好了,因为它不会影响其他样式(是吗?)……

    :P

    2010 年 5 月 23 日 21:37

  10. Luca

    关于保留用户隐私

    将 Firefox 的“layout.css.visited_links_enabled”选项设置为 false 会完全禁用已访问链接的样式,我认为这是一个过于激进的解决方案。

    为什么不引入一个选项,允许仅在当前域中设置已访问链接的样式?

    例如,它可以用“layout.css.visited_links_scope”选项替换“layout.css.visited_links_enabled”选项,该选项具有数值:0 = 完全禁用已访问链接,1 = 仅在当前域中启用已访问链接,2 = 完全启用已访问链接

    2010 年 5 月 27 日 03:19

    1. Shadok

      非常好的观点,日志无论如何都在这里。

      但是应该有一个其他键来将此行为限制在域名第 n 层,否则这将被滥用,通过免费或 ISP 相关的托管服务提供商托管恶意脚本。

      附言:很高兴看到这个博客上的开发速度如此之快,你们做得很好!
      太可惜了,我无法在技术上提供帮助,我希望有一天能加入 :)

      2010 年 6 月 16 日 13:31

  11. Max

    如果我更改已访问链接的边框底部大小,它会更改框大小,对吧?所以……你们有没有听说过基于检查图像缓存通过测量图像加载速度的类似技术?

    2010 年 6 月 13 日 20:36

  12. J.S.

    这些限制是打算作为长期解决方案还是仅仅是临时补丁?如果删除 CSS 支持成为应对安全问题的常态,那将令人遗憾。也许浏览器有一种方法可以在内部重新创建 CSS 效果(例如,通过 Javascript)。

    2010 年 6 月 14 日 18:53

  13. […] 改进:Mozilla 始终将隐私放在首位,此最新测试版修复了一些 Web 标准中的缺陷,这些缺陷可能会泄露您的浏览器 […]

    2010 年 7 月 6 日 14:38

  14. Euro

    Firefox 4 将使用 SQLite 而不是 JSON 或 XML 是一件好事,

    SQLite 快得多。

    2010 年 7 月 7 日 09:16

  15. Michael Kozakewich

    哈,那将是一个主意。浏览器可以将所有内容渲染为链接未被访问时的状态,将其存储在 getComputedStyle 中,然后以视觉方式呈现允许在已访问链接上使用任何 CSS 的重新渲染页面。基本上,向屏幕显示一个渲染,然后向 javascript 和 PHP 打开另一个渲染。当然,不允许使用背景图片或任何其他服务器调用(但 data:URI 呢?)

    但是,对于一点已访问链接样式,这是否值得?

    2010 年 7 月 7 日 10:54

  16. Matt Amacker

    为什么我们对 API 撒谎的解决方案感到满意?

    这不是解决问题的根本错误方法吗?当一位聪明的工程师认为“嘿!如果我对已访问颜色执行 X 操作,我可以帮助我的客户”,却在经历了诸多挫折和没有获得任何实际帮助后发现 API 撒谎时,会有多少无数个小时被浪费掉。这不好 - 当存在合法错误时,因为我们不确定其他 API 方法是否也在撒谎,会有多少其他 API 方法会被重新审查?我们不能假设每个人都知道这个谎言。

    这不是解决此问题的正确方法。如果您不允许查看值(例如,当您提取像素数据时使用的 canvas),则应抛出错误。然后我们可以同时提供相同域的验证。创建撒谎的 API 会产生比这种单一方法调用更深远的后果。

    糟糕。

    2010 年 7 月 7 日 13:36

    1. Bastian

      我也更喜欢一个不撒谎的 API,API 应该发送错误或应该阻止抓取器。如果抓取器每秒只能获得 10-100 个结果,那么抓取将是浪费时间。在“真正的”网页上,有多少链接,而不是 30k+。我认为减速会更好。

      2010 年 7 月 8 日 21:54

    2. Daniel Dinnyes

      完全同意!应该给出警告或错误。

      2010 年 11 月 9 日 08:44

  17. Jacob Rask

    :after:before 伪类以及 content 属性怎么样?例如:a:visited:after { content: 'visited'; }

    2010 年 7 月 8 日 03:33

  18. ZhouQi

    “:visited”样式对于用户了解他访问过哪个 URL 非常非常……非常重要。
    我认为限制设计师使用 CSS 属性以降低 Web 可用性不是一个好主意。

    2010 年 7 月 8 日 20:33

    1. Jason

      我从来不明白为什么 *将已访问链接的样式设置得不同* 很重要。我参与的几乎每个网站,我都为链接设置了相同的样式,无论其访问状态如何。

      耸耸肩。也许只是我……

      2010 年 8 月 3 日 09:44

      1. ZhouQi

        因为大多数视觉设计师都不了解 Web 可用性。这确实非常无助。

        2011 年 1 月 4 日 18:59

  19. Stephen

    @Matt Amacker

    是的,但是如果它抛出一个错误,那么它会表明该链接已被访问,因为它与查询未被访问的链接的结果不同。

    我必须承认,我不喜欢它,但我不知道是否有更好的解决方案。

    2010 年 7 月 9 日 05:38

  20. John

    文本装饰呢?那是一个很大的问题。

    2010 年 7 月 9 日 14:04

  21. Matt Amacker

    @Stephen

    不,如果尝试访问不应该访问的值,它会在任何时候都抛出错误。它不会以任何方式表明该链接是否被访问过——只会告诉你无法查看。

    2010年7月9日 17:06

    1. Giso Stallenberg

      @ Matt Amacker

      这意味着你将无法再从任何 a 元素获取任何计算后的样式。

      2010年8月8日 07:07

      1. Peter da Silva

        那会很糟糕吗?

        2010年12月2日 04:23

      2. Damon

        不,这需要去除任何元素上的 getComputedStyle 方法,因为盒模型的原因。如果你让链接拥有 margin 或 padding,那么它会将其他元素推到屏幕周围,从而可以通过在链接之后添加一个 span 元素并获取信息,即使 a 元素本身抛出错误而不是允许 getComputedStyle。

        2010年12月13日 15:01

  22. Ant Gray

    我从未见过有人使用 :visited,因为它会被 a{color:…} 覆盖。

    2010年7月10日 23:39

  23. ab lafontain

    我无法安装 Add-on Fire FTP。还有其他人遇到这个问题吗?在之前的版本中它运行良好。

    2010年7月16日 12:41

  24. […] 原文:隐私相关的 CSS :visited 更改,作者:Christopher […]

    2010年7月20日 06:20

  25. Buddhism For Vampires

    Panopticlick 实验让我非常害怕,所以我很高兴看到这种情况发生。

    FF 4 是否解决了其他 Panopticlick 漏洞/建议?

    2010年7月20日 14:31

  26. Sebastian Ferreya

    我认为现在这样就可以了。

    理想情况下,浏览器应该允许在显示页面的域内对已访问链接进行完全样式化,并对外部 URL 降级到当前的解决方案。

    这将为开发人员/样式师提供足够的表达灵活性,同时将隐私保持在安全的技术边界内。

    2010年7月21日 12:33

  27. […] 改进以防止指纹识别 CSS 攻击。 […]

    2010年7月26日 05:22

  28. […] 为了提高用户隐私,我们实施了多项更改,例如阻止恶意网站上的 css :visited 选择器尝试获取浏览历史记录信息。 […]

    2010年7月27日 19:13

  29. White-Tiger

    如果 Firefox 实施了这玩意,我就会改用其他浏览器,并且永远不会向任何人推荐 Firefox。
    好吧,我是一个不太在乎我访问过的链接的人,因为我没什么好隐藏的,所以对我来说无所谓。

    但浏览器应该做浏览器应该做的事情。所以当我告诉浏览器做某事(并且这是一个有效的标准)时,它应该这样做,否则浏览器就是垃圾,我最好使用一个正常工作的浏览器。

    另一件事是这种“安全”并不是安全。所以有一些因素使得这种利用变得不重要
    1. 脚本需要很长时间才能暴力破解足够多的“有趣”数据。
    2. 这种脚本需要大量资源,我将检测到它/那个网站。
    3. 抱歉,但我不知道知道用户历史有什么好处^^
    4. 这种对浏览器的损害,也就是这里所说的工作,实际上并没有什么作用,只是损害了浏览器,因为如果我没记错的话,你不需要 getComputedStyle() 等,你只需要使用“javascript:node.style.color”读取当前链接颜色并加载一个特殊的 URL 来确定已访问链接的颜色。(例如,使用 iframe)。

    所以只要你在 CSS 中不禁用 :visited 等,就没有安全的方法来防止这种滥用。
    唯一可行的方法是一个智能浏览器,它应该像一个杀毒软件一样,检测不良脚本并询问用户如何操作。例如,当脚本使用一个大循环并检查一些链接属性时,它就是危险的……这不会损害浏览器,并且应该可以工作。

    这只是一个简短的想法,我希望我不会错得太离谱;)
    也请原谅我的英语……希望足够了:P

    此致
    White-Tiger

    2010年7月30日 19:15

    1. Matti Schneider-Ghibaudo

      我将只回答你提出的证明利用不重要的几点
      1. http://www.check-history.com/visitedsites.html 加载需要多长时间?
      2. 加载上一页是否让你检测到任何可疑活动?
      3. 只需要测试你所在国家/地区 10 大银行中的哪些网站你访问过,就可以知道应该尝试用哪个网站来钓鱼你(可能通过 tabnagging:http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/)。
      或者,可能在经济上威胁较小,但对隐私问题来说相当令人烦恼:这也可以用来了解你是否访问过色情网站、类似 meetic 的网站或在线游戏……基本上,对于任何你希望别人不知道你访问过的网站来说,这都是一种威胁。
      4. 如果 API 撒谎,那就是撒谎。如果浏览器假装一些不存在的东西,那么就没有办法通过 JavaScript 了解任何信息,因为 JS 只是要求浏览器提供信息。

      你的检测“不良脚本”的想法不可行,因为有太多方法可以规避这些检查(主要是由于 JS 非常动态,例如无法在加载时对其进行评估)。除此之外,以银行为例,即使只测试一家银行就足够了,因为统计上应该有足够多的访客来进行一些钓鱼测试。

      我希望你现在能更好地理解这个问题 :)

      2010年7月31日 15:27

  30. White-Tiger

    啊,我明白了……好的……钓鱼是一个问题^^
    而且我看到 JS 不像我想象的那么好^^ 所以“.style.color”或“.color”不起作用^^ 这很糟糕^^ 所以 getPropertyValue 当然是唯一的方法
    但应该有一种方法可以使用 Flash 或 Java 来检测这种情况……例如,只需截取屏幕截图,然后解析文本及其颜色^^ 这更复杂,但并非不可能。

    2010年8月1日 03:35

  31. Will Entriken

    这里有一种攻击仍然可以针对提议的解决方案起作用,请参阅源代码和说明

    http://privacylog.blogspot.com/2010/08/mozillas-css-visited-solution-is-still.html

    2010年8月2日 09:17

    1. Peter da Silva

      这不是一个可用于自动攻击的漏洞。这是一种社会工程攻击,可以用来检查每次访问时可能的一个或两个网站,并且频率不会太高。getComputedStyle 攻击可以用来检查每个页面上的数千个网站。这就像使用彩虹表破解散列密码文件中的密码与使用网站的正常界面尝试登录来破解密码之间的区别。

      2010年12月2日 04:33

  32. Giso Stallenberg

    当 API 不撒谎,而是抛出错误时,人们也可以知道链接是用伪类 visited 进行样式化的,而这正是这里试图避免的事情。

    2010年8月8日 07:04

    1. Dennis

      它应该在每次使用 getComputedStyle() 及其相关方法时都抛出错误。
      或者更好的是,FF 应该阻止 JS 执行并发出警告,提示正在使用隐私不安全的 JS,类似于现在网站尝试获取浏览器位置时所做的那样。

      2010年12月11日 12:28

  33. […] 对 CSS 标准的实现进行更正,以便网站不再能够查看您访问过的其他网站。 […]

    2010年8月12日 06:22

  34. FrozenKnight

    我当时在想,创建一个 CSS 和 JavaScript 黑名单可能更好,以便用户可以将不允许的属性等列入黑名单以及它们被触发时的行为。也许可以通过站点排除来设置此功能,例如一些为点击广告等提供奖励的游戏。(或者如果你想在某些网站上启用它)
    我个人认为这将是最佳解决方案,其中一些可以默认启用并由用户编辑。

    2010年8月20日 12:13

  35. Henrik

    请告诉我这是否会以任何方式影响我的个人样式表(使用 Stylish 和类似的工具)。

    2010年8月25日 16:42

    1. Henrik

      看起来会的。用户样式、用户代理样式和作者样式都将以相同的方式处理……

      2010年8月26日 07:13

  36. Sebastian Ferreya

    博客需要一个类似 Reddit 的投票系统。让那些好的评论浮到顶部。

    2010年8月26日 00:56

  37. Hugh

    我使用边框底部来设置链接的样式(看起来更漂亮,比 text-decoration:underline 更突出)。未访问的链接是实心的,已访问的链接是点状的。

    这破坏了该样式,并且让我困惑了很长时间。

    我理解破坏 CSS 这部分内容的理由,我想我也可以接受。我只是希望有一个解决方法。

    2010年9月4日 12:50

  38. John Farren

    getComputedStyle 不是唯一撒谎的部分,整个 document.getElementById(“any_element”).style 也无法访问了。
    你怎么会认为这是一个可行的解决方案?
    此致

    2010年9月7日 08:36

  39. louis

    嘿,这是我见过的最好的帖子之一;你可以在同一个主题中包含更多想法。我仍在等待你在下一篇文章中发表一些有趣的见解。

    2010年9月25日 20:19

  40. YuriKolovsky

    只需为 :visited 链接禁用 javascript……无需触碰 css。
    我的意思是,在隐私模式下浏览时向 javascript 提供未访问链接的值,但保持它们的外观与往常一样。

    2010年9月30日 08:32

  41. James B.

    我比较同意 White-Tiger 的观点:我将考虑换用其他浏览器。当我看到一个页面上有许多链接时,我需要一种可靠的方法来隐藏或修改我已访问过的链接,这样我就不会重复操作。这是一件每天都会出现的低效的事情,会导致大量时间浪费。虽然我感谢保护隐私的想法,但必须有一种方法可以在保护隐私的同时仍然让我更好地控制已访问的链接。

    2010年10月2日 12:38

  42. Will Entriken

    James,

    你在说什么?这可以用 CSS 完成,也许还有一些不关心链接是否被访问过的 JS。

    2010年10月3日 08:21

  43. James B.

    根据原始条目,只有颜色可以更改,可见性不能更改。由于 JavaScript 无法访问浏览器历史记录,因此你无法在那里进行操作,但这也是隐私问题的关键所在。我理解破坏 JS 方法的原因,但 CSS 也被破坏就没有道理了。

    2010年10月3日 22:21

  44. Spider

    不要忘记添加一个选项来禁用/启用此功能……
    另一个解决方案是对除当前域名之外的其他网站伪造可见性。

    2010年10月13日 04:14

    1. thinsoldier

      对这两个建议表示赞同。

      我发现已访问链接样式在某些网站上非常有价值,尤其是在论坛上,并且我为一些我喜欢的网站编写了用户样式,这些样式不仅仅是更改链接颜色。

      如果我们将已访问限制在当前域内工作,那么 Mozilla 就无需禁用任何样式,对吧?或者这在某种程度上仍然不够安全?

      2010年10月15日 08:29

    2. thinsoldier

      对于任何大型/深度银行/股票市场之类的网站,其中域内历史仍然有价值,那么我们可以使用元标签或 http 标头来告诉浏览器绝对不要跟踪历史记录吗?

      2010年10月15日 08:32

  45. Lay

    这是一个非常好的消息。事实上,目前没有浏览器能够保护其用户免受这些攻击,自从我第一次听说这些攻击以来,我一直为此感到困扰(那不是很久以前,但我了解到这些攻击已经观察了近 10 年,并且通过社交网络群体进行身份识别已经为人所知数月)。

    说实话,我一直在检查功能列表,看看是否会实现此功能,如果没有,我准备发送请求。

    这将大大有利于 Firefox 在我的“我应该使用哪个浏览器?”困境中。目前,我也使用 Opera,因为它在某些方面有一些原因使它成为更好的选择。这种情况主要发生在基于浏览器的游戏中,其中
    – 你可以在选项卡上验证表单的速度、切换到下一个选项卡、再次验证、再次切换等使得 Firefox 成为一个糟糕的选择,尤其是在某些情况下,当表单在提交时运行一些 javascript 时,Ctrl+Tab 无法切换选项卡),
    – 由于 BeforeScript 事件处理程序允许用户在页面脚本运行之前阻止或修改页面脚本,因此 Opera 的用户脚本比 GM 脚本更强大。我尝试快速编写 Firefox 插件来做同样的事情,但(可能是因为我没有做好),这大大降低了页面的加载速度,而在 Opera 中则不会。

    因此,使用 Firefox 4,它将成为通用浏览的 Firefox(NoScript、AdBlock、此 :visited 更改以及我喜欢的其他插件),可能仍然使用 Opera 进行基于浏览器的游戏。

    2010年10月15日 05:03

  46. thinsoldier

    我的同事可能发现了一个错误

    #navigation a, #navigation a:visited {
    color:#fff;
    padding-top:7px;
    text-align:center;
    }

    尽管常规链接和已访问链接都被告知要有填充,但一旦链接被访问,填充属性就会消失。

    现在我不会以这种方式编写此规则,但显然有些人会这样做,他们可能会感到困惑/恼火。因此,如果已访问和普通链接样式在一个规则中定义,则应忽略 :visited 并坚持使用普通的未访问链接样式

    2010年10月15日 08:25

    1. Matti Schneider-Ghibaudo

      :D

      这不仅令人困惑,更重要的是,这是一个漏洞!因此,如果有人以这种方式编写规则,则访问链接后填充将被忽略……然后只需测量封闭框的大小即可获取信息!酷……

      2010年10月15日 08:49

  47. Daniel Dinnyes

    我不是网页开发人员,但我还是想发表一下我的看法。

    如上文“Matt Amacker”所述,没有任何警告或错误消息的虚假 API 将成为大量挫折的来源。

    此外,功能更改会影响许多人,正如我们上面所见。不过有一点需要注意:没有人抱怨他们错过了能够使用 JavaScript 访问基于 :visited 属性先前修改的元素的样式属性的功能。所有投诉都来自最终用户、外观和设计角度。

    即使我不知道 WebKit 中页面渲染的内部细节,我建议引入一个新的渲染“层”,并具有有限的访问权限。仅在该“有限访问层”内才能执行依赖于 :visited 标志的 CSS 和 JavaScript 代码。这样,这些脚本引入的样式更改将不会在正常的“完全访问权限”层中可见。不确定这是否现实或可行。

    2010年11月9日 09:05

  48. YuriKolovsky

    另一种解决方法是简单地移除跨域的 :visited 链接。

    2010年11月10日 01:06

  49. Sebastian Ferreyra

    Yuri:我完全同意。我之前也在这里(在上面搜索)和其他地方发布过类似的提案,但到目前为止一直被忽略。

    也许我们应该发出一些声音,让人们听到。

    2010年11月10日 09:21

  50. Paul

    我几乎同意跨域 :visited 的观点。但有一个问题。

    你可能需要合法地链接到其他域名,并且希望用户能够通过 CSS 一致地被告知他们已经点击了该链接。浏览器必须存储历史记录项的来源,才能区分使用你的网站访问链接的用户和使用其他网站或地址栏访问链接的用户,而这太复杂了。

    至于用户样式表,我同意每个域设置一个选项,如果你信任该网站,你只需禁用“修复”。

    我无法想象使用 JavaScript 查找链接是否已被访问的合法理由(你可能会说通过提供目标内容来增强用户体验)。我相信所有你可能有的理由,你都可以轻松地忍受,或者你可以找到其他方法来在你自己的域名上实现类似的效果(想想本地存储和 Cookie),所以也许没有人真正关心修复的 JavaScript 部分。

    对于那些说他们会使用其他浏览器的人,如果你觉得这些更改对你的体验有害,那就去做吧,你仍然生活在一个自由的世界里,你不需要威胁说你不会使用 Firefox,没有人关心你使用什么,而关心的是大多数人使用什么(Firefox 有许多你在其他浏览器中找不到的优势,而且我知道你更关心这些优势,而不是用边框给链接加下划线)。

    大多数用户会很高兴知道他们软件中的漏洞得到了修复,并且对他们的用户体验几乎没有影响(颜色是 90% 的时间用来表示已访问链接的属性)。无论如何,不再使用 Internet Explorer 是朝着正确方向迈出的一大步,对此表示赞赏。(尝试使用与背景类似的颜色隐藏已访问链接,而不是真正隐藏它)

    说另一个浏览器是一个好的替代品,就像说“我很高兴已访问链接在我的其他浏览器中有效,即使某些其他 CSS 由于渲染引擎不如 Firefox 的好而导致设计严重损坏”。从这个角度来看,你使用 Chrome 作为替代方案可能是最安全的,尽管等等……他们也决定以类似的方式修复这个问题,糟糕,你必须回退到其中一个“80% 完成”的浏览器,甚至更糟糕的是,Internet Explorer(尽管 IE 9 测试版相当不错)。

    作为一名 Web 开发人员,我并不关心这个问题如何解决,有很多很好的方法可以优雅地解决新的 CSS 问题(或者根本不解决,正如上面另一位 Web 开发人员指出的那样),并且 JavaScript 的影响确实无关紧要。我希望有选择退出功能,因为它可以帮助使用用户样式表的人,否则我并不关心。

    2010年11月11日 07:11

  51. YuriKolovsky

    @Sebastian
    问题来自 JavaScript 能够使用 CSS 共享用户的历史记录,现在我对 Firefox 4 中完全禁用 :visited 的解决方案感到震惊,仅仅有一些颜色变化毫无意义。

    当前:全局历史记录 -> 网站级 CSS -> 网站级 JavaScript -> 网站
    应该是:网站级历史记录 -> 网站级 CSS -> 网站级 JavaScript -> 网站

    对我来说更有意义,现在为什么 Mozilla 不实现这个功能呢?要么他们很愚蠢,我怀疑情况并非如此,要么有不实现它的其他原因,一些你我都不了解的原因,我只是希望一些 Mozilla 开发人员能分享他们的见解。

    2010年11月11日 07:57

  52. cw3theophilus

    我是一名 Web 设计师,我对这个隐私问题的解决方案感到震惊。我每天都使用 :visited 将我网站中用户访问过的链接区分开来,以便用户不会对他们访问过的和未访问过的链接感到困惑或迷失。我还将其与 JS 一起使用,编写新的 CSS 规则以显示用户当前所在的页面。尤其是在我的导航栏中。
    很多时候我需要使用不透明度、渐变背景、边框、字体粗细、文本装饰和背景图像来区分它们。
    我不关心 getComputedStyle,因为我几乎从未使用过它。

    我的建议是将 :visited 限制在同一域内的链接中——我的意思是,谁在乎一个网站是否可以看到你在其网站上访问了哪些页面;他们可以用 Google Analytics 做同样的事情——或者完全禁用 getComputedStyle,因为只有非常高级的网站和应用程序才会使用它。

    如果此功能没有更新和修复,我将不会升级到 FireFox 4,而是会继续使用版本 3,即使我无法使用所有不错的 HTML5 功能。

    2010年11月12日 07:10

    1. André

      好吧,如果你想的话,你可以继续使用 FF3,但用户会继续使用 ff4(或兼容的 Mozilla SeaMonkey 2.1),而这才是重要的。
      就我个人而言,我非常高兴那些浪费带宽的特殊效果(如图像)正在被抛弃。
      如果你不能用前景、背景、边框和轮廓颜色产生体面的效果,你就会被其他人超越。
      而且 Mozilla(以及最终其他)用户会欣赏更好的隐私和更少浪费带宽的好处。
      以及更少的过于复杂的网页。

      2010年12月15日 01:48

    2. e.r.

      是的……我讨厌这个新的限制……现在我必须在数据库中保存用户点击了哪个链接,以便之后隐藏它……将其更改为域名限制!!!!

      2011年6月7日 13:50

  53. Gary Hvizdak

    目前我使用 a:visited { background-color : transparent; }。在卸载了几个月后,我刚刚重新加载了 Google Chrome,并发现我的一些链接在访问后被涂黑了。所有受影响的链接都通过 :link 伪类设置了背景颜色。有趣的是,将 :visited 背景颜色设置为与 :link 背景颜色相同的链接没有这个问题。

    所以我想知道这个新的 Chrome 错误是否与提议的 Firefox :visited 更改有关?

    2010年11月15日 23:07

  54. ARCN

    我听说 IE 9 将有一个“不跟踪”浏览器按钮可以使用。FF 是否可以在不执行你提到的所有其他操作的情况下拥有相同的功能?

    2010年12月10日 20:59

  55. Paul

    你们真的不明白吗?没有人关心 Web 开发人员是否升级到 Firefox 4。用户会升级,开发人员将不得不应对这些变化,所以不要抵制,而是尝试提出建设性的想法。大多数说他们不会升级的人听起来像是在糖果被偷的孩子。

    你可能会受到影响(Web 开发世界的一个小众群体可能会感受到这种变化的影响,因为大多数人只使用颜色),但用户并不关心,就像他们不关心 IE6 一样。你没有使用 IE 6,但你的 65% 的用户使用了,那时你停止修复它的错误了吗?Firefox 中的这个东西甚至不会是一个错误,它将是一个在正式发布前甚至就已描述过的经过充分记录的安全功能。大多数普通用户会升级到 FF4,没有人会关心你对此有何感受。要么建设性地发言,要么闭嘴。

    我已经做了 6 年多的 Web 开发人员了,我真的不认为不得不适应这个限制会真正伤害我。

    2010年12月12日 01:06

    1. ray

      说得很好。

      2010年12月25日 05:17

  56. awsdert

    我认为这是一个很好的改变,我的意思是,指示已访问元素所需的只是颜色变化,一个优秀的开发者需要用户的整个历史记录做什么。此外,要获取用户在本会话中的网站范围内的历史记录,服务器只需被编程为为每个会话创建一个列表,然后该列表可以在以后由需要它的脚本使用(使用 user-h.php 或类似的东西通过 AJAX 将列表传递给 JavaScript)。

    2010年12月12日 04:06

  57. Joe Honton

    在采取此步骤之前,请考虑美国联邦公报于 2000 年 12 月 21 日发布的电子和信息技术可访问性标准(第 508 节),如下所示

    § 1194.21 (g) 应用程序不得覆盖用户选择的对比度和颜色选择以及其他个人显示属性。

    § 1194.21 (i) 颜色编码不得作为传达信息、指示操作、提示响应或区分视觉元素的唯一手段。

    § 1194.22 (c) 网页应设计成使所有用颜色传达的信息也可在没有颜色的情况下获得,例如从上下文或标记中获得。

    2010年12月13日 20:32

  58. awsdert

    虽然这些因素很重要,但考虑你的目标受众也很重要,例如,游戏网站不太可能被盲人访问,并且通常会考虑到色盲人士的设计。

    2010年12月22日 13:32

    1. Andrew

      更不用说 CSS 与用户选择的颜色无关了。这是你在 Firefox 设置中设置的东西,而且我敢肯定 Firefox 不会让 CSS 覆盖它。

      2010年12月28日 21:56

  59. YuriKolovsky

    @Paul
    真正重要的是 Firefox 是否走在了正确的道路上,因为在我看来,他们会长期修复这个到目前为止“小功能”……

    2011年1月4日 13:39

  60. Crystobal Lions

    我是一名 Fire Fox 用户,我感到震惊的是,一些开发人员在这么多年后仍然在功能上缺乏安全意识。开发人员,如果你无法修复你的黄金代码或遵循安全的框架或支持安全的浏览器,那就让开,让那些在安全方面明智地犯错的人去做。

    真的,如果你坚持要向以像素为中心的巴比伦 JavaScript 神灵低头,而安全最多只是一个无关紧要的或事后才想到的事情,那么请在你自己本地的变量范围内这样做。

    2011年1月9日 13:23

    1. Kafpauzo

      我讨厌这个改变。我想使用 FF4,但因为这个改变,我不得不继续使用 FF3。

      为什么?好吧,这是因为网络是一个混乱和杂乱的空间,很难跟踪你已经访问过的内容。点击一个链接,等待,哦,不,我已经访问过这个链接了,然后返回并重新操作,这令人沮丧。有了这个变化,这就像一个猜谜游戏。许多开发人员将已访问链接的颜色保持与普通链接相同,以保持网站的整洁和一致性。

      我使用 Stylish。创建了自己的脚本,为我访问过的链接添加轻微的光晕。它覆盖了开发人员的样式。它使我浏览互联网的效率更高。我可以直观地看到我到过哪里。这减少了沮丧感。

      有更好的方法来保护隐私。这似乎是一种懒惰的方法。请将其更改回原来的样子,并找到更好的方法。它不仅影响开发人员,也影响用户。更好的解决方法是将默认的历史记录缓存设置为仅保留 1 或 2 天的历史记录。

      我真的很想使用 FF4 作为我的默认浏览器。这个改变让我不得不停留在旧版本上。

      2011年4月20日 02:09

      1. Paul Rouget

        @Kafpauzo 你不明白。你描述的不是 Firefox 当前的行为。重新阅读文章。getComputedStyle 撒谎了,但这对最终用户没有任何改变,用户仍然会看到链接是“紫色”的。

        2011年4月20日 14:55

        1. nomail

          FWIW,我有一个书签,可以为已访问的链接/图像添加轮廓,它不再有效——这个新功能应该可以选择。我感谢 Firefox 默认情况下关注我的隐私,但我并不欣赏失去选择权——我理解减少配置选项是其理念的一部分,但该死的,我们需要更多选择 :)

          2011年5月5日 02:01

          1. FLskydiver

            不喜欢这不是用户选项。我使用一个书签来隐藏我已经访问过的文本和图像链接,而我刚刚更新到的 Firefox 4 却杀死了它。

            请允许我们选择不使用此“功能”!

            2011年5月8日 19:37

  61. sdfpokdfsj

    像其他人提到的那样,在当前域内保留旧的行为听起来是个好主意。

    2011年1月15日 06:02

  62. stfuandrtfm

    是时候有人主动执行功能(安全)而不是形式了。我一点也不在乎超链接的颜色是否表明我是否访问过某个页面,如果你们能想到的唯一解决方案是使用一种可以将我电脑的内脏泄露给最高出价者的方法,那么请发送你页面的 URL,以便我知道永远不要再访问它们。正是像你这样的开发者让大量的目标广告统治了网络。

    2011年1月21日 14:25

  63. Peter

    在我忘记之前快速地发帖:如果你只能更改颜色,那么你就会失去一些可访问性。例如,如果所有未访问的链接都是粗体,而已访问的链接是普通粗细,那么对于有一定程度色盲的人来说,更容易看到。

    而且我真的不明白为什么限制将应用于已访问链接的内容,如果它在被询问时只是撒谎。它似乎只是降低了设计和可访问性,而没有真正的必要。让功能随意撒谎,但不要把设计部分牵扯进来。

    2011年1月23日 18:36

    1. Matti Schneider-Ghibaudo

      请阅读 Christopher Blizzard 和我的评论(第一页,搜索“2010 年 4 月 23 日下午 5:20”) :)

      2011年1月24日 05:03

  64. MJ。

    你们在开玩笑吗?我的天!如果 Firefox 今天/本周再次崩溃;我不会尖叫。什么鬼?

    然而,我确实感谢 Firefox 的所谓“安全”更新。是时候有人动动脑子和技能并用它们来创造东西了……已经等了很久了。
    我对 Google/Chrome 非常不信任,Google 一直以来都是这样。我永远不会使用它。
    绝对不欣赏 Chrome Google 在我的电脑上自行下载。直接绕过 McAfee!

    2011年2月3日 20:39

  65. trlkly

    问题在于,你不能为了修复一个bug而破坏功能。如果问题是访问过的链接上的某些样式会泄露用户信息,那么粗体字就出问题了,因为它会让文本占用更多空间,从而可以被查询。解决方法要么像Chrome一样保持粗体字与非粗体字相同的大小。

    加载背景图片是个问题,因为它会查询服务器。所以要让背景图片在页面加载时预加载。这几乎可以解决所有问题——把所有链接都视为已访问过的状态进行分析。

    最后,指纹识别是一个问题,但很多人不在乎。而那些在乎的人一开始就不会使用原版的Firefox。我们会使用广告拦截器、noscript,以及在风险情况下使用内置的隐私浏览模式。

    这完全是倒退。JavaScript + CSS + HTML5 应该是一个完全成熟的系统,可以取代许多过于霸道的插件。为了让用户不得不回到依赖Firefox的状态而移除功能,这太愚蠢了。

    我真的希望程序员能从他们的道德制高点上下来,设计用户想要的东西,而不是自以为比他们应该服务的用户更了解用户。

    顺便说一句,我觉得很有趣的是,他们突然间可以接受破坏标准了,而之前他们却一点也不在乎。设计师会根据事实上的标准进行设计,而不是根据Firefox精英们告诉他们的去做。别再装成IE了。

    2011年2月9日 04:38

  66. Cycron

    我认为这些更改应该默认启用,但应该有一种方法可以禁用它们。

    2011年2月26日 15:43

  67. Frank Willwright

    我不知道。狗狗是表达我对CSS感受的方式,我更喜欢黄色或棕色。默认或不默认。指纹识别是一个问题,它与遥远的未来和荒原无关。我们只是信息浩瀚网络中的一点微光……谁在乎呢!时间终将追赶上一切。此致,敬礼!Frank

    2011年3月1日 14:34

  68. Steve

    在我看来,访问过的链接毫无用处。我怀疑如果整个访问过的概念消失了,是否有人会真正注意到。我个人在关闭浏览器时会清除历史记录,所以很少看到访问过的链接。如果你的网站非常复杂,以至于有人需要查看他们去过哪里,那么可以使用cookie来跟踪用户在网站上的行为,或者重新考虑你的网站设计,可能存在设计问题。

    也就是说,总有一些人喜欢它们。所以请允许它们可以启用(默认情况下禁用访问过的链接)。让我们选择是否冒险让我们的历史记录被查看。然后,当大多数网站决定停止使用访问过的链接时,你就可以最终完全删除访问过的链接功能了。

    2011年3月2日 02:09

  69. Kafpauzo

    选择的解决方案过于激进,并且影响范围远远超出必要范围。更好的解决方案应该是这样

    — 为了阻止非JavaScript攻击,即服务器检测CSS背景图像获取:无论是否访问过,始终获取两个图像,访问过的和未访问过的,始终按相同的顺序。如果存在其他具有类似影响的CSS属性,则始终假装渲染访问过的和未访问过的版本。

    — 为了阻止JavaScript检测:确定链接的尺寸和两种情况下产生的文本流,一种是使用访问过的链接版本,另一种是使用未访问过的链接版本。以这样一种方式设置页面布局,以便为两种版本都留出空间。让用户在该空间中看到链接的正确版本。让JavaScript看到未访问版本的设计设置。

    — 对兄弟节点和嵌套元素执行相同的操作。与上面一样,为两种版本都准备足够的空间,显示正确的版本,让JavaScript看到未访问的版本。

    — 只禁止那些对渲染影响过于巨大的CSS属性,以至于上述方法无法正常工作,即禁止float、clear和display之类的属性。

    通过这种解决方案,大量以各种完全合法的方式使用各种装饰的网站仍然可以正常工作。他们只会注意到在 :visited 使用像粗体或边框宽度这样的改变尺寸的属性的罕见情况下出现的轻微难看。而这些网站上唯一的问题是链接的大小和文本流会变得有点难看。样式的信号功能仍然存在。

    2011年3月3日 22:54

  70. Kafpauzo

    以防我的解释不够清楚

    在非JavaScript情况下,尽管您从服务器获取访问过的和未访问过的背景图像,但您只允许用户看到根据链接的访问/未访问状态正确的那个。

    2011年3月4日 02:12

  71. Joe

    上面有一条评论说“不要为了修复bug而移除功能”。这种关于良好安全性的假设并不现实。如果没有对最终用户和开发人员的一些限制,就没有办法保证安全。移除一小部分功能来阻止开发人员和用户使用功能部件的某些部分,在这里并不是牺牲。数据挖掘和身份盗窃比能够在访问过的链接上使用背景图像要严重得多。Mozilla基金会做得好!他们有足够的勇气关心用户的安全,而不是网页开发人员的痛点。

    此外,从开发的角度来看,他们删除此功能有一个非常好的理由。这与关注点分离有关。如果您想保存状态或了解先前的活动,则有机制可以做到这一点。使用表示元素来完成cookie或服务器端持久性应该完成的工作,这只是糟糕的解决问题的方法。持久性和应用程序感知不应与表示混合。

    2011年3月5日 15:39

  72. th

    新的Firefox棒极了。

    2011年3月5日 19:06

  73. Hawk

    我不喜欢这些样式限制。

    为什么不将getComputedStyle限制在与运行JavaScript的网站具有相同域的URL上呢?如果域不匹配,则“撒谎”并返回一个值,就像链接未被访问一样。如果域相同,应该没问题。

    为什么CSS必须这样被削弱?

    2011年3月8日 14:46

  74. T.

    感谢Mozilla。作为一个从Firefox 4 RC文档中的链接中了解到此问题的用户,很高兴知道我的隐私得到了保障,即使懒惰的开发者对无法使用某些晦涩的CSS功能感到愤怒。

    2011年3月9日 16:06

  75. Tar

    此更改破坏了“隐藏访问过的链接”类型的书签功能,例如来自
    https://www.squarefree.com/bookmarklets/pagelinks.html

    如果有人有解决方案可以让“隐藏访问过的链接”在FF4/SM2.1上工作,我将不胜感激。

    Bug 147777 – :visited 支持允许查询全局历史记录 – https://bugzilla.mozilla.org/show_bug.cgi?id=147777

    2011年3月11日 07:35

  76. Carl

    能否请一位“知情人士”——最好是来自Mozilla——对人们提出的所有关于削弱某些JavaScript功能而不是削弱CSS的建议发表评论?

    最近,“Hawk”写道
    “为什么不将getComputedStyle限制在与运行JavaScript的网站具有相同域的URL上呢?如果域不匹配,则“撒谎”并返回一个值,就像链接未被访问一样。

    为什么CSS必须这样被削弱?

    2011年3月11日 17:38

  77. Glenn

    这个主意和校服一样好……并且在毕业后也必须继续穿;但是,是的,当然……让我们也破坏所有人的可访问性。至少您应该允许用户和用户代理CSS修改任何它想要修改的内容(嘘:这就是为什么它被称为“层叠”)。

    2011年3月12日 10:05

  78. The Neighbourhood Nerd

    为什么不显示一个警报来警告用户该网站正在运行此代码?

    警告:此网站正在尝试访问您的历史记录。允许?

    以及永久阻止此行为的选项。

    2011年3月13日 14:04

  79. YuriKolovsky

    @The Neighbourhood Nerd 因为这几乎不可能,它从你意想不到的不同地方获取这些信息。

    2011年3月15日 02:44

  80. Peter

    “不要仅仅依靠颜色。”
    http://www.w3.org/TR/WAI-WEBCONTENT-TECHS/#gl-color

    “确保所有用颜色传达的信息也可以在没有颜色的情况下获得,例如来自上下文或标记。”
    http://www.w3.org/TR/WCAG10/#gl-color

    当然,标准是Firefox的核心价值观?欺骗JavaScript就足够了,你不需要因此而损害标准和可访问性。如果脚本无法检测访问过的链接,那么这就足够了,所以没有理由仅仅为了它而限制CSS。像在菜单中“取消粗体”或访问过的链接具有褪色的背景这样简单的事情将变得不可能,即使它会大大提高可扫描性。

    我只能再次重申,标准必须发挥作用,当然必须考虑到有可访问性问题的人?当然,向脚本提供错误的值就足够了?这些值已经存在,没有必要削弱CSS。完全没有必要。

    2011年3月16日 17:47

  81. Peter

    @Carl:我同意,外部链接是造成整个问题的原因,对吧?然后这些链接如果出现任何问题都可以承担后果。可能存在共享相同域的网站主机的问题,但这应该很容易通过URL层次结构来解决。

    但我仍然认为,用错误的值(颜色、边框、图像、布局——一切都会“看起来”像所有链接都没有被访问过一样)来欺骗脚本是最好的方法。

    2011年3月16日 18:01

  82. MattG

    人民不受不合理的搜查和扣押的权利,其人身、住宅、文件和财产不受侵犯,不得侵犯;未经可能的原因,除非由宣誓或确认支持,并特别描述将要搜查的地方以及将要搜查的人或物品,否则不得发出任何搜查令。
    ——美国宪法第四修正案

    我的浏览器历史记录无疑是我的财产之一。任何未经授权就收集我浏览器历史记录的网站都在侵犯我的第四修正案权利。可耻!:P

    不完美的安全不是问题,而是那些想要利用它来对付你的人——这是真正的问题。有时你阻止他们,有时你让他们通过,但无论哪种方式,如果你能做到,你都会给他们一个教训。

    2011年3月17日 11:09

  83. […] 将您的隐私放在首位,修复了一些允许坏人窥探和暴露[…]历史记录的错误。

    2011年3月19日 11:35

  84. […] 仅供参考,这不再有效。[…]

    2011年3月21日 08:00

  85. […] 将您的隐私放在首位,修复了一些允许坏人窥探和暴露[…]历史记录的Web标准错误。

    2011年3月21日 08:09

  86. Duncan

    这真的会搞砸标记访问过的链接的可用性!!

    我的父母都有短期记忆丧失(我母亲患有阿尔茨海默症,父亲中风过几次)。他们不记得是否使用过某个链接。

    所以他们使用了我为他们安装的“隐藏访问过的链接”书签。效果很好,但在FF4.0上失效了。

    这让人非常恼火,因为很难教会他们使用新的浏览器,除非有人有其他解决方案,否则这是我唯一的选择?

    2011年3月24日 01:00

    1. Hemilton

      如果他们不记得是否访问过某个网站,为什么他们会在乎呢?

      2011年4月22日 16:01

  87. One

    应该允许用户禁用此功能。我通过插件使用自定义全局样式表来更改访问过的链接的不透明度,现在我无法更改了。我不是开发人员,我的:visited对我来说很有用。

    2011年3月25日 07:12

    1. Tom

      我同意。我使用userContent.rss强制访问过的链接的样式,但现在这不再起作用了。我理解为什么进行此更改,但我愿意接受潜在的信息泄露。

      这应该可以通过about:config进行配置(当然,默认情况下禁用)。

      2011年3月31日 15:55

  88. marc

    禁用:visited样式的想法很愚蠢。

    这确实反映了负责程序员缺乏创造力,我相信会有其他方法来解决这个小小的安全问题。

    令人遗憾的是,这个改动最终还是实施了,甚至IE9和Chrome10也纷纷效仿。

    2011年4月9日 17:05

  89. ranimi

    我也希望:visited功能恢复!
    我同意Tom的观点。
    “这应该可以通过about:config进行配置(当然,默认情况下应禁用)。“
    Ranimi

    2011年4月12日 01:42

  90. GlitchMr

    然后网站管理员会利用cookie来存储用户访问过的链接,你点击链接,它就会存储到cookie中。这使得事情变得复杂。

    2011年4月14日 10:34

    1. ehsan

      salam

      2011年4月29日 22:59

  91. Alan Gresley

    这个安全问题有那么难理解吗?

    [href*=”http://www.google.com/”]:visited {background: url(images/gallery/im1.jpg);}
    [href*=”http://www.google.co.uk/”]:visited {background: url(images/gallery/im2.jpg);}
    [href*=”http://www.google.com.au/”]:visited {background: url(images/gallery/im3.jpg);}

    如果显示背景,则表示您已访问http://www.google.com/
    如果显示背景,则表示您已访问http://www.google.co.uk/
    如果显示背景,则表示您已访问http://www.google.com.au/

    2011年4月19日 09:36

    1. Alan Gresley

      锚链接中的HTML代码被去除了。

      2011年4月19日 09:38

  92. Tomcat76

    我不明白的是:如果仍然允许颜色设置,那么禁止其他基本CSS设置(如font-weight)有什么意义呢?对我来说毫无道理。

    从个人的角度来看,我想说我的安全是我自己的事。我不介意应用程序自带一些基本的安全措施,但任何像这样极大地影响CSS标准支持的措施都应该可以配置。

    我同意通过CSS完全控制:visited并非绝对必要,但当前的选项过于有限。

    2011年4月23日 08:18

  93. Henrik

    我运营着一个网站,该网站的功能仅仅是告诉人们他们的浏览历史,当然,当人们进入网站并运行诊断工具时,他们完全了解其工作原理,我现在别无选择,只能让这个网站“进入历史”了。:-(

    2011年4月30日 07:08

  94. Henrik

    Tomcat76:禁用font-weight、border-size、height、width等的原因可能是,否则我们将能够使用.offsetHeight、.offsetWidth、.offsetTop等来确定某个URL是否已被访问。

    2011年4月30日 07:12

  95. Eric

    我并不关心这个“功能”,也不担心某些网站知道我访问过哪些页面。请给我们一个禁用它的选项。

    2011年5月8日 15:23

  96. ben

    自从FF1以来,我一直是Firefox的忠实拥护者,我不会使用带有这个“功能”的FF4(尽管你可能不在乎……)。然而,我认为许多其他人和我一样。

    我认为你们已经发展到一个阶段,开始(像许多其他公司一样)走错了方向;与其试图将“你们的方案”强加于我们(虽然,我们已经克服了极权主义政权——或者M$),不如给我们一个提示,让我们自己决定是否需要这个选项(=> 实现一个开关!)。

    为了清楚起见,我为什么认为这个选项有用:通常——浏览大型链接列表时——FF 3.x的功能允许我区分我已经访问过的链接和尚未访问过的链接*即使它们可能具有不同的标签*。

    2011年5月14日 04:47

  97. marc

    您好。由于懒惰,我从未使用过:visited标签,直到今天。仍然存在一个问题,即是否仅将:visited的使用限制在指向同一域名/网站的链接上就足够了,而不是完全禁用该功能。可以通过其他方式确定用户是否点击了自己域名中的某个链接,因此那里没有真正的安全问题。

    2011年6月1日 10:01

  98. Glenn

    你知道,鉴于你将对任何试图“窥探”你的“访问历史”的应用程序/网站撒谎,说“不,从未去过那里”,那么为什么你还要破坏用户使用CSS自定义链接样式的能力呢?对于作者/网站样式,尽管去做吧——我不在乎。但对于用户/用户代理样式,不要干预我的浏览器/页面,让我按照自己的意愿进行样式设置。某些人真是太放肆了……

    2011年6月2日 13:26

  99. […] CSS :visited选择器已更改,以阻止网站能够检查用户的浏览历史记录[…]

    2011年6月9日 21:53

  100. […] Mozilla的这篇文章解释了他们正在采取哪些措施来帮助打击这种行为,请在此处查看。请随时发表一些评论,让我们知道你对这一切的看法。2011年6月25日[…]

    2011年6月25日 04:53

  101. evrix

    如果有人关心,我添加了一个使用此javascript的书签,它似乎在xp上的ff 5.0中有效
    javascript:(function(){var%20newSS,%20styles=’a:visited%20{color:%20white;%20background-color:%20white;%20display:%20none}’;%20if(document.createStyleSheet)%20{%20document.createStyleSheet(“javascript:'”+styles+”‘”);%20}%20else%20{%20newSS=document.createElement(‘link’);%20newSS.rel=’stylesheet’;%20newSS.href=’data:text/css,’+escape(styles);%20document.documentElement.childNodes[0].appendChild(newSS);%20}%20})();
    我在“display:%20none”之前添加了“color:%20white;%20background-color:%20white;%20”,可以安全地删除它
    带有图片的链接仍然显示,但相关的文本会被*隐藏*。

    2011年6月27日 12:20

  102. Jason Featheringham

    这似乎天生就是反直觉的。为什么不只是过滤访问过的链接的getComputedStyle()呢?在我看来,判断失误。

    2011年7月2日 15:47

    1. evrix

      我修改了一个在早期版本中有效的书签,它不是我创建的,我对js不太了解。

      ps:抱歉脚本行太长了。

      2011年7月3日 11:45

  103. Julian

    我对此没问题,但你能告诉我,我现在如何隐藏访问过的链接吗?

    2011年7月3日 09:33

    1. evrix

      只需显示书签栏,并将书签添加到其中(例如,添加一个名为“删除已访问”的书签,并将代码放在地址栏中),转到任何网页并点击该书签:已访问的链接将隐藏或变为白色。
      致所有人:我不是javascript程序员,事实上,我对javascript一窍不通:),因此任何建议都能做得更好

      2011年7月5日 01:05

    2. evrix

      @louis
      一些css标签似乎不再允许与已访问的链接一起使用,我错过了什么吗?

      2011年7月5日 01:07

      1. louisremi

        我的意思是,你仍然可以通过使用相同的颜色和背景色来隐藏链接。如文章所述,例如“display: none;”是不可能的。

        2011年7月7日 05:39

  104. Julian

    Evrix
    那个书签对我完全无效。

    Luisremi
    我想隐藏它们,将它们设置为“不显示”。
    如果我不能像那样用CSS来做,那么我该怎么做呢?
    我没有时间,也没有必要的知识来制作我自己的扩展程序(如果功能被删除,那么是否有其他功能可以替代它?)。

    2011年7月7日 07:47

  105. Moon

    Evrix,

    感谢您尝试提供帮助!但那个书签对我也不起作用。我完全按照你的指示做了,但当我点击我创建的书签时,链接根本没有变化。

    它对其他人有效吗?

    (顺便说一句,我刚刚安装了Chrome,看看它是否取代了这个丢失的功能。显然,在最近版本的Chrome中也实施了类似的限制,所以这对我们来说不是一个选择。)

    2011年7月11日 21:40

  106. ben

    建议

    1) 为我们提供一个开关来关闭新行为。
    2) 允许本地“url(‘data:image/png;base64,…)”样式更改为“background-image”。
    3) 允许更改“background-color”。
    4) 为我们提供一个仍然可以更改的元素列表(“https://mdn.org.cn/en/CSS/Privacy_and_the_:visited_selector”中提到的元素不起作用——除了“color”)。
    5) 为我们提供使用4.0之前“安全漏洞”的网站示例。

    2011年7月13日 01:30

  107. Luis

    嗨,
    我有一个页面,其中包含许多用图像标记的链接。这是页面
    http://luis.impa.br/foto/index1.html
    如您所见,我在img链接周围使用了黄色边框阴影。由于这与未访问/已访问的链接的蓝色/品红色边框不匹配,因此我希望边框阴影的颜色根据未访问/已访问状态相应更改,但这不起作用。我尝试了使用CSS :visited能想到的所有方法。
    我的问题是否与本页面中描述的问题相关?是否可以用CSS解决?
    谢谢!
    L。

    2011年7月24日 12:35

    1. louisremi

      是的,我们的问题很可能与本页面中描述的更改相关。
      请仔细阅读文章。

      2011年7月25日 00:47

  108. Nailgun

    我理解这是一个问题,但目前提出的解决方案荒谬至极。

    这对色盲或色弱的Firefox用户来说太糟糕了;它完全排除了他们。我希望如果重新启用(简单的)文本装饰(如删除线、上划线和下划线),则计时攻击将无效。我理解这是一个安全问题,但如果漏洞大到影响可访问性,开发人员就应该咬咬牙,彻底重构。
    我将就此写一封电子邮件,看看我能走多远;除了颜色之外,还需要有其他方法来直观区分不同类型的文本。如果出于任何原因禁用普通“a”链接的非颜色样式,这将是一个类似的障碍。

    2011年8月4日 05:42

  109. Danny

    这种“保姆式”的做法完全错误,但如果你“必须”做一些事情来“保护”用户,那么你可以,例如,默认情况下每24小时清除FF的历史记录……

    搞砸CSS规范简直是荒谬……接下来是什么?你不会阻止人们登录Facebook吧?

    教育是一个更好的方法,不要阻止我完成我的工作!让一些“每日提示”或“每日建议”弹出窗口告诉用户了解一下并清理他们5年历史的记录。

    2011年8月7日 12:25

    1. chee

      什么。比起限制:visited的样式,更倾向于每天删除历史记录似乎有点疯狂。

      另外,这并没有“搞砸”CSS规范。让我们一起看看css2规范。
      http://www.w3.org/TR/CSS2/selector.html#link-pseudo-classes

      “注意。样式表作者可能会滥用:link和:visited伪类来确定用户访问了哪些网站,而未经用户同意。
      因此,UA可能会将所有链接视为未访问链接,或实施其他措施来保护用户的隐私,同时以不同的方式呈现已访问和未访问的链接。有关处理隐私的更多信息,请参阅[P3P]。”

      这实际上符合规范,并且比规范允许的要稍微友好一些。

      2012年10月26日 09:37

  110. Axel

    给我一个开关!

    我已经收到警告了。

    Axel

    2011年8月8日 01:06

  111. […] 将用户的隐私放在首位,修复了一些允许坏人窥探和泄露浏览器历史记录的错误。新值[…]

    2011年9月2日 14:26

  112. ilPestifero

    为我们的隐私做出的出色工作。
    谢谢Mozilla!

    2011年9月26日 03:39

  113. Reason A Bubble

    我想他们没有阅读评论。

    共识似乎是,某种形式的选择加入切换比告诉我们“这是你想要的,这是你得到的”更好。

    我发现关于这会给色盲人士带来问题的评论非常相关。

    通往地狱的路是用善意铺成的。

    2011年10月5日 15:27

    1. Christopher Blizzard

      抱歉,有时我们会错过评论。我们不是在忽视,只是有时真的很忙。

      让我咨询一下David Baron,他编写了原始补丁。(需要明确的是,支持这一点实际上可能需要大量的工作。)

      2011年10月7日 07:06

    2. Christopher Blizzard

      此外,是否有关于此问题的错误文件?这将非常有帮助。

      抄送我并给我发送邮件 - blizzard@mozilla.com

      2011年10月7日 07:09

  114. Moon

    同意。我认为Mozilla的人们没有费心,因为人们并没有因此而放弃使用Firefox。

    Chrome也有一些同样的独断专行的政策,你懂的。

    拜托,Mozilla。至少在about:config中添加这个选项。我想不出你们单方面删除重要的Firefox功能,甚至不允许高级用户恢复它的任何借口。

    如果其他人有办法,我洗耳恭听。

    2011年10月6日 20:37

  115. Lila

    `:visited` 有很多无害的用途,但 Firefox 7 似乎都不支持了。我理解隐私方面的担忧,但为什么要在 CSS 层面解决这个问题?我使用 `:visited` 来显示用户已经访问过网站的哪些部分,方法是更改链接的背景颜色。看起来现在我需要更改文本本身来提供此信息,例如“首页(已访问)”。这不是最优雅的方法——除非,当然,你使用 JS。大量的 JS。这当然会带来所有与 JS 相关的安全问题。

    所以,出于安全原因,你强迫人们放弃只使用 HTML 和 CSS,转而使用 JavaScript 来实现相同的效果?请告诉我这是一个玩笑。

    2011年10月7日 07:20

    1. chee

      你仍然可以使用 `background-color` 来设置已访问链接的样式。
      你不能使用 JavaScript 来确定哪些链接已被访问。

      发生的事情和你认为的正好相反。

      2012年10月26日 09:30

  116. LeftEarofCorn

    我通过书签工具在已访问的图片链接上使用 `display:none`,用于图片库,以便知道我已经查看了哪些图片。在为工作审查数千张非常相似的照片时,以其他任何方式跟踪都是非常麻烦的。由于没有 `about:config` 选项来切换这种糟糕的新行为,我不得不回退到 FF3。

    2011年10月7日 14:33

  117. Moon

    P.S. 为什么评论发布顺序错乱?我看起来像个真正的傻瓜,因为我显然是在 Mozilla 开发人员之后发布的。

    2011年10月7日 16:35

    1. Peter da Silva

      它们没有乱序。它们嵌套了,但嵌套方式有点微妙的灰色框。开发人员作为对消息的回复发布了,你发布了对主题的回复。

      2011年10月8日 04:39

      1. Moon

        真奇怪。我没有任何灰色框或嵌套(使用最新版本的 FF)。也许是我的设置中有什么不寻常的地方。

        我到此为止;不想偏离这个话题。

        2011年10月9日 04:38

  118. Moon

    我在此处提交了一个错误报告:https://bugzilla.mozilla.org/show_bug.cgi?id=693164

    一位 Mozilla 开发人员将错误的状态更改为已解决(无效)。我不知道他是否费心阅读了此页面上的评论,但似乎至少有一位开发人员认为这不是问题。

    如果你不同意,请随时加入那里的讨论。

    2011年10月9日 08:15

  119. David P

    为什么不允许透明颜色和边框样式的更改?这个问题还在继续解决吗?

    我不明白为什么我们不能让 `getComputedStyle()` 对包括显示和定位在内的所有内容都撒谎,表现得好像链接没有被访问过一样。也许是性能问题,需要跟踪“真实”的 DOM 布局和“虚假”的 DOM 布局,或者需要根据需要生成“虚假”的 DOM 元素层次结构。

    如果没有其他方法,至少要让用户样式自由地使用我们喜欢的已访问链接。我完全支持上面发布的 Bugzilla 错误。这仍然给 REAL 用户和忠实粉丝带来了很大的痛苦。

    2011年10月12日 16:33

  120. Bernd Schneider

    首先我要说我不是开发人员,而是一位网站管理员,我更喜欢专注于内容,而不是修复代码错误。我对 CSS 了解相对较少,但由于我正在运行一个完全手工制作的网站,因此我也不会获得任何专门的支持。

    现在,我的网站上的已访问外部链接看起来很糟糕,因为我使用了相同的 GIF 基本背景图片,它以前会随着链接一起更改颜色。现在它是青绿色与黄色以及黑色上的白色并列。如果让我说,这是最大的惩罚。

    我必须向我的访问者解释
    1) 为什么它看起来这么糟糕。
    2) 为什么我不对此做任何事情。
    3) 对于那些阅读了有关隐私主题内容的人,我可能还需要证明为什么我使用“恶意代码”来嗅探他们的浏览器历史记录(当然我从未这样做过)。

    我解决问题的选项
    1) 开发一个全新的颜色/图像方案,其中背景图像始终保持其颜色,并且在链接旁边仍然看起来不错。
    2) 丢弃所有外部链接的标签。我花了几天时间将它们整合到代码中。只需点击几下即可在样式表中禁用额外的可用性。
    3) 其他选项?

    2011年11月8日 11:41

  121. roger21

    太糟糕了

    我有一个 Greasemonkey 脚本,它允许我一次性打开 Reddit 页面上所有未访问的链接,使用 `getComputedStyle`,现在它不起作用了。

    我有一个 Stylish 样式,它更改了链接的字体粗细,未访问的为粗体,已访问的为正常(当然使用 `:visited`),它非常方便突出显示未访问的链接并淡化已访问的链接,现在它不起作用了。

    太糟糕了

    至少可以有一些插件或其他东西来绕过这个,太糟糕了。

    2011年11月15日 04:54

  122. [...] 但是,你不应该依赖 `:visited`。确实,它可以用于历史记录嗅探,并且浏览器可能会最终删除对大多数更改布局的 CSS 属性(例如 `display`)的支持,就像 Firefox 已经做的那样。[...]

    2011年11月15日 10:37

  123. Christos Georgiou

    请:在 `about:config` 中添加一个选项,允许 `:visited` CSS 功能像以前一样工作;我们已经收到有关安全问题的警告。

    2011年11月17日 00:13

  124. armin

    about:config
    CSS 功能:visited

    不起作用

    2011年11月24日 06:33

    1. Bernd Schneider

      而且没有帮助,因为它是一个单独的设置。

      2011年11月24日 07:24

  125. heike

    哦,太棒了!‘<
    我花了整个下午尝试在 FF 中使已访问的链接不可见——然后我偶然发现了这篇文章,我感到非常震惊。
    疯狂的想法,伙计!这是什么鬼东西?!:@

    2011年12月19日 08:39

  126. popitto

    你找到解决这个问题的方法了吗?我正在使用 FF 9.0.1,我在 `about:config` 中找到了一项条目(`layout.css.visited_links_enabled`),它是“true”,所以我将其更改为“false”,但没有任何变化!已访问链接的颜色仍然相同(与未访问的不同)!

    2012年1月23日 09:02

  127. brenda

    我正在上大学课程,这导致软件崩溃了很多次
    我不能让这种情况发生并丢失所有工作,我更新了最新的 Firefox,没有那个工具栏
    让我打印出来,我应该怎么做?你能给我一些建议吗?

    2012年3月25日 21:52

    1. Eric

      这与 CSS 安全性有什么关系?

      2012年3月26日 10:54

  128. estrella

    无评论

    2012年10月8日 18:29

  129. Serguei

    也许 Mozilla 浏览器中有一些设置可以关闭受信任站点的 CSS 隐私?

    2012年11月24日 18:37

  130. Moon

    你们所有发表评论的人都应该考虑在此处的官方错误报告中发布你们的评论

    https://bugzilla.mozilla.org/show_bug.cgi?id=693164

    在这里发布没有意义。在那里发布可以提高问题的知名度。

    2012年11月30日 16:03

本文的评论已关闭。