≪ 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は適用されずリンクの色は変わらない