Partitioning :visited links historyという提案があります。
2025年4月にリリースされるChrome135で有効になる機能です。
これ実はユーザにわりと影響のある変更なのですが、全く知られておらず話題にも上がっていないんですよね。
なにせ日本語記事が一切見当たらない。
ということで、ここで紹介しておきます。
具体的にどうなるの?
まずGoogleとYahooJapanで同じ語句を検索します。
ここでは例としてPHP8.4がリリースされたので新機能全部やるを使います(宣伝)。
この記事を見たことがない場合、リンクは未訪問です。
ここでGoogleから記事へのリンクを踏むと、YahooJapanから該当記事へのリンクも訪問済になります。
当然ですね。
それではchrome://flags/からpartition-visited-link-database
を有効にしましょう。
これはせChrome134以下でもPartitioning :visited links history
を有効化するフラグです。
その後Googleからリンクを踏むと、Google側のリンクは訪問済みになります。
ところがYahooJapanからのリンクは未訪問のままです。
なんで?
どうしてこんなことをする必要が?
かつては疑似クラス:visited
のプロパティをJavaScriptやCSSから取得することが可能でした。
その結果どうなったかというと、もちろん隠しリンクを大量に並べてユーザの訪問履歴を奪取することでフィンガープリントしたりやターゲティング広告したりする攻撃が蔓延ることになりました。
その対策として、最終的に:visited
プロパティは取得できないようになり、またほとんどのプロパティは設定もできないようになりました。
取得しようとすると常に未訪問というステータスが返ります。
設定できない理由は、たとえばheight
などを変更すれば訪問済かどうかを簡単に取得できてしまうからですね。
ここで問題が終わればよかったのですが、実際はそれだけで解決することはなく、たとえばCSS transitionで訪問済を抜く、Ambient Light Sensorを使って画面の明るさで訪問済か判断する、タイミング攻撃などの脆弱性がその後も頻発することになりました。
また特に斬新なものとしてこんなものもあります。
よくあるCAPTCHA認証に見えますが、実際は黒が:visited
リンクとなっており、つまりユーザが訪問済サイトを自己申告してくれるという代物です。
これに至ってはブラウザ側で防ぐことすらできません。
ということで、本問題に対して、ついに根本的な対策が行われることになりました。
Explainer: Partitioning :visited links history
本提案をひとことでまとめると、訪問済かどうかを判定する基準が、これまで『リンク先サイト』だけだったところを、『リンク元サイト+リンク先サイト』に変更します。
考え方としてはCookieのパーティショニングCHIPSとだいたい同じです。
この変更によってどうなるかというと、たとえばさきほどのCAPTCHA認証のふりをした攻撃サイトでは、全てのリンクが常に未訪問になります。
攻撃サイトに訪問履歴が流出することがなくなりました。
もちろん自身のWebサイトからリンクを辿って行った場合の情報は取得できるわけですが、これはそもそもクリックを取得するなりでどうとでもできるので本提案の対象外です。
問題は、自サイトから訪れたわけではない訪問済サイトがわかってしまうことだったので、この問題については完全解決されました。
他ブラウザの反応
Firefoxはポジティブであり、おそらくそのうち実装されます。
そもそも本提案の原案となった:visited
プロパティ設定・取得制限を率先して行ったのがMozillaですからね。
Safariはいまのところ方針を決めていませんが、妥当だろうとは言っているのでいずれ対応されると思います。
ユーザへの影響
最初に言ったとおりの問題が発生します。
『サイトAからサイトXに行ったら、サイトAからサイトXへのリンクは訪問済なのに、サイトBやCからサイトXへのリンクは未訪問』
たとえば複数の個人リンク集サイトから情報収集している人なんかが、「あれ?これさっき見たはずなのに訪問済じゃないぞ?」ってなりそうです。
感想
本提案そのものは妥当な変更であると、個人的には思います。
ただ、けっこうユーザに影響のある大きな変更だと思うのですが、そのわりにユーザへの周知などは全然行われていません。
理由としては許容可能な範囲だろうからまあいいんじゃねだそうです。
さすがにもうちょっと発信してほしいところですね。