CSS の :visited に行われるプライバシー対策

訳注 (2013-01-28): 現在 :visited の対策は他のブラウザでも行われており、Firefox に限ったことではありません。対応状況については MDN の :visited の項をご覧ください。

原文: privacy-related changes coming to CSS :visited (Christopher Blizzard 著)

本件の詳細については David Baron の投稿該当するバグMozilla Security Blogの投稿 をお読みください。

訳注: Mozilla Security Blogの投稿は「CSS によるブラウザ履歴の漏えいを防ぐ取り組み」に日本語訳が公開されています。

長年にわたり、CSS の :visited セレクタ はユーザの履歴を取得する経路となっていました。このセレクタ自体は特に危険ではありませんが、JavaScript の getComputedStyle() とともに使われることで、ユーザの履歴を詮索しどのサイトに訪れていたのかを知ることができるのです。そして、これらはとても素早く行われます。テストでは、1分間で 210,000 もの URL を確認できた という結果が出ています。この割合でいけば、ユーザの履歴にブルートフォースを行う(訳注: 総当たり検索でユーザの訪問済みサイトリストを取得する)ことや、最低限でも フィンガープリンティングによるユーザの識別 を行えてしまいます。ブラウザが履歴を長期間保存することもあり、ユーザの Web 上の行動をかなり把握されてしまうおそれがあります。

私たち Mozilla は人々のプライバシーを保護することについて真剣に考えています。よって、私たちはユーザのためにこの問題を修正することにしました。修正にあたり、私たちは Firefox の :visited の振る舞いを変更します。この修正が反映されるのがどのバージョンなのかはまだわかっていませんし、修正するコードもまだレビュー段階にあります。しかし、私たちはこの問題の修正について早いうちから皆さんに知っていただきたいため、現時点での情報をお伝えすることにしました。

:visited の振る舞いの修正は Web サイトや開発者に影響を及ぼしますので、デザイナーや開発者の方は注意してください。変更点は次のとおりです。

  • getComputedStyle は偽の情報を返します (querySelector など似通った関数についても同様です)。これらの関数は、たとえユーザがそのサイトにアクセスしていても、していないと偽って値を返すようになります。
  • 訪問済のリンクにスタイルを適用することは引き続き可能ですが、利用できる機能は著しく限定されます。利用できる CSS プロパティは color, background-color, border-*-color, outline-color, そして fillstroke の色に関するプロパティになります。その他のプロパティについては、未訪問のリンクに与えられたものが代わりに利用されます。これらのプロパティの制限に加えて、rgba()hsla(), transparent を指定することができなくなります。

訳注: rgba(), hsla() については、不透明度 (A) の指定が適用されないだけでRGBについては反映されます(:link で不透明度が指定されていれば、それが適用されます)。

広く使われているのが明らかなスタイルだけが引き続き適用されるということです。また、セレクタの挙動も次のように変更されます。

  • :visited + span など隣接セレクタ (結合子) を使用した場合、その span にはリンクが未訪問である時のスタイルが適用されます。
  • (稀ですが) リンク要素が入れ子になっており、マッチした要素が訪問情報をテスト中のリンクと異なる場合、その要素も未訪問リンクであるかのように扱われます。

これらの変更はわかりにくいので、別のポストで例示することにします。

Web 開発者への影響は最小限にとどめています。これは私たちの意図でもあります。しかし、Web サイトの修正を余儀なくされるケースも存在します。

  • 訪問済リンクに 背景画像 を与えてスタイルを区別する方法は今後機能しなくなります。
  • 訪問済リンクに与えた CSS Transitions を私たちはサポートしません。CSS Transitions を利用した Web サイトはまだ多くなくあまり影響はないと考えていますが、サポートされないケースとして知っておいてください。

私たちは皆さんがどう :visited を利用しているのか、また皆さんのサイトにどのような影響があるのかを知りたいと思っています。これらの変更によって壊れてしまうものがあるなら、最低でもそのケースをまとめておきたいのです。情報をお持ちの方は、他の人にもわかるようにぜひコメントをお願いします。

2 件のコメント

  1. yu :

    訪問済みリンクが事実上、色だけで区別できるとなると、色の組み合わせ方によっては、(たとえ健常者でも)アクセシビリティが著しく落ちてしまい、利便性が悪くなることが考えられます。制作者側からみても、訪問済みの表現の工夫の余地が相当に無くなってしまい、新しい表現を模索する余地も著しく限られることになります。
    利用者保護の観点から、すでに色々な議論がされているとは思いますけれども、現実的にはCSSの:hover疑似クラスでは様々なスタイル属性の設定はできるけれども、JavaScriptが返す値には反映されないような実装に緩和するのが適切ではないかと考えます。

  2. dynamis :

    yu さん、ご意見ご提案ありがとうございます。

    残念ながら、RGB 色以外に幅広いスタイルをサポートしつつ JS から判別できなくするというのは原理的に困難です。
    例えば、文字の大きさを変えられるとすれば、その要素自身の getComputedStyle() では判別できなくとも、ボックス全体の大きさなど周囲への影響で判別されてしまいますし、実際の大きさと異なる値であることで位置や大きさに応じたスクリプトが誤動作する原因となります。
    また一般に、処理時間が異なるようなスタイルを適用可能にすると、処理時間の差異を調べるパフォーマンステストによって訪問済みかどうかを判別できるようになります。

    そういった事情を踏まえて、一般的に既に使われている RGB 色の指定に限ってサポートするが、JS 側から getComputedStyle() ではそれを判別できなくなるという実装が適切と判断されたものです(詳細は David のブログや Bugzilla での議論をご覧ください)。

    なお、アクセシビリティという点でいえば、既存のサイトで行わない独自のスタイルでの表現を行うことそれ自体が、アクセシビリティ的に適切ではないと考えられています。サイト特有の振る舞いに利用者は気づかず、利便性に結びつきません。

    # :hover 疑似クラスは関係ありませんのが、:visited のつもりですよね?