ブラウザの「ページ内検索」から、試しに「a1b2c3」と検索してください。
概要
Chromium系のブラウザでは、ページ内検索でマッチした際にだけ表示されるhidden="until-found"という属性が存在します。 あらかじめ主要な文字を全て用意しておいて、ユーザーが一文字入力するごとにその文字列にさらに別の任意の一文字を追加した要素を全列挙して用意していくことにより、 ユーザーがページ内検索で入力した内容を取得することができます。
要素の隠し場所について
この手法ではページ内に大量の要素が必要になりますが、これらをすべて1x1のサイズのdiv内に埋め込むことで、ユーザーからは直接見ることができないようにしています。
スペースを検出する方法
テキストをHTMLに埋め込む段階でその次に一文字ないとスペースが無視されてしまい、検索に含まれるスペースを検出できなくなります。 そのため、入力候補のうちスペースの場合だけ例外的にスペースの次に適当に一文字配置しておいて、検出時にはその一文字を無視する挙動にしています。
削除を検出する方法
一文字削除した場合には、「一文字削除した文字列」だけはヒットして残りの候補が全部隠れた状態になるため、これを検知することで削除を考慮できます。 また、検索が終わる前に次の文字が削除されてしまうことを防ぐため、一文字だけではなくニ文字、三文字.... そしてそこから残り一文字になるところまで消した候補を全部用意しています。ダメです、動きません!ブラウザの挙動意味わからん。とりあえず一文字要素だけ全部残すことで、一度全部消して別の単語で再検索を始めたときには検出できるようにしました。
謝辞
以下の記事からhidden="until-found"属性の存在を知りました。 元の記事ではa/b/cのみ1文字ずつ単体で検出していますが、ここではそれをサイドチャンネル攻撃に応用して任意の文字列を取得できるように拡張しました。
ページ内検索したテキストはWebサイト運営者にバレる|TechRacho by BPS株式会社
(c) 2026 ActiveTK.