≪ Today I learned. RSS購読
公開日
タグ
Web , Security
著者
ダーシノ

なぜ:visitedのプライバシー保護対策が必要なのか?

Chrome 136:visitedのプライバシー保護が強化された。

背景と問題点

:visitedは閲覧済みリンクを視覚的に区別するために使用されてきた。しかし、この機能をつかって悪意あるサイトが「ユーザーの閲覧履歴を推測する」ことが可能だったため、以前から問題視され、さまざまな対策が講じられてきた。

閲覧情報が推測されると、以下のような危険性がある。

JavaScriptで閲覧済みのリンクを検出する

const links = document.querySelectorAll('[href]');
const defaultColor = document.body.style.color;

for (const link of links) {
  const style = window.getComputedStyle(link);
  if (style.color !== defaultColor) {
    console.log(`Visited link: ${link.href}`);
  }
}

現在の対策

プライバシー上の理由から、:visited擬似クラスで適用できるスタイルが厳しく制限されており、colorbackground-colorなど色に関するスタイルのみが許可されている。また、window.getComputedStyle()では:visitedでない色の値を返すようになっている。

Chromeの取り組み

Chrome 136以降では、さらにプライバシー保護を強化するために、:visitedリンク履歴のパーティショニングを行っている。

パーティショニングをする前は、コンテキストに関係なく閲覧済みの場合は、どのサイトでも:visitedで閲覧状態がわかってしまった。

パーティショニングでコンテキストによって:visitedの閲覧情報を隔離することで、意図しない情報漏えいを防ぐことができる。

Before

<!-- example.com -->
<a href="https://bcrikko.github.io">bcrikko.github.io</a>
<!-- 悪意のあるサイト: evil.example.org -->
<a href="https://bcrikko.github.io">bcrikko.github.io</a>
  1. example.comページを表示する
  2. リンクからbcrikko.github.ioを閲覧する
  3. example.comのページで:visitedが適用され、リンクの色が変わる
  4. evil.example.orgのページを表示する
  5. bcrikko.github.ioが閲覧済みなので、:visitedが適用されリンクの色が変わる

After

  1. example.comページを表示する
  2. リンクからbcrikko.github.ioを閲覧する
  3. example.comのページで:visitedが適用され、リンクの色が変わる
  4. evil.example.orgのページを表示する
  5. bcrikko.github.ioが閲覧済みであっても、コンテキストが異なるため:visitedは適用されずリンクの色は変わらない