Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10049] ファイルの概要

コミット

コミット: 98e723ed098abf6a4b9dae27108cc9ee6f07919b Author: Nigel Tao nigeltao@golang.org Date: Wed Oct 19 10:54:04 2011 +1100

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/98e723ed098abf6a4b9dae27108cc9ee6f07919b

元コミット内容

このコミットは、Go言語の html/template パッケージにおけるCSS エスケープのテストケースを修正したものです。具体的には escape_test.go のテストケースが、CSS エスケープの変更(Change 5306042)に対応するよう更新されています。

変更内容:

  • ファイル: src/pkg/exp/template/html/escape_test.go
  • 1行削除、1行追加
  • テストケース「styleStrSpecialsEncoded」の期待値を修正

変更の背景

2011年当時、Go言語のテンプレートシステムは実験的な段階にあり、特にHTML/CSS/JavaScriptコンテキストでの安全なエスケープ処理の確立が重要な課題でした。このコミットは、CSS エスケープの実装変更に伴って、テストケースの期待値を更新する必要が生じたことを示しています。

CSSescape において、特定の文字(特にスペースやバックスラッシュなど)のエスケープ処理に変更が加えられ、その結果としてテストケースの期待値も修正が必要となりました。この変更は、HTML テンプレートエンジンのセキュリティ強化と標準化の一環として行われたものです。

前提知識の解説

HTML テンプレートエスケープの重要性

HTMLテンプレートにおけるエスケープは、XSS(Cross-Site Scripting)攻撃を防ぐために極めて重要です。Go言語の html/template パッケージは、コンテキストに応じた自動エスケープを提供します。

CSSエスケープの仕組み

CSS内では、以下のような特殊文字がエスケープされる必要があります:

  • / (スラッシュ) → \2f
  • ' (シングルクォート) → \27
  • " (ダブルクォート) → \22
  • ; (セミコロン) → \3b
  • : (コロン) → \3a
  • \ (バックスラッシュ) → \\

16進エスケープ形式

CSS エスケープでは16進数形式が使用されます。例えば:

  • \2f/ のUnicodeコードポイント (U+002F) を表現
  • \27' のUnicodeコードポイント (U+0027) を表現

技術的詳細

エスケープ処理の変更内容

このコミットでは、CSS エスケープにおけるスペース文字の処理方法が変更されました。具体的には:

変更前:

font-family: '\2f**\2f\27\22\3b\3a\2f\2f \\', "\2f**\2f\27\22\3b\3a\2f\2f \\"

変更後:

font-family: '\2f**\2f\27\22\3b\3a\2f\2f  \\', "\2f**\2f\27\22\3b\3a\2f\2f  \\"

変更点は、\2f\2f の後にスペース文字が2つになったことです。これは、CSS エスケープ処理において、連続するスペース文字の処理方法が変更されたことを示しています。

コンテキスト認識エスケープ

Go の html/template パッケージは、データが挿入される文脈を自動的に認識し、適切なエスケープを適用します:

  1. HTMLコンテキスト: HTML エンティティエスケープ
  2. CSSコンテキスト: CSS エスケープ(16進形式)
  3. JavaScriptコンテキスト: JavaScript エスケープ
  4. URLコンテキスト: URL エンコーディング

コアとなるコードの変更箇所

変更されたのは src/pkg/exp/template/html/escape_test.go の394行目付近です:

{
    "styleStrSpecialsEncoded",
    `<a style="font-family: '{{"/**/'\";:// \\"}}', &quot;{{"/**/'\";:// \\"}}&quot;">`,
-   `<a style="font-family: '\2f**\2f\27\22\3b\3a\2f\2f \\', &quot;\2f**\2f\27\22\3b\3a\2f\2f \\&quot;">`,
+   `<a style="font-family: '\2f**\2f\27\22\3b\3a\2f\2f  \\', &quot;\2f**\2f\27\22\3b\3a\2f\2f  \\&quot;">`,
},

コアとなるコードの解説

テストケースの構造

このテストケースは3つの部分から構成されています:

  1. テストケース名: "styleStrSpecialsEncoded"
  2. 入力テンプレート: CSS の font-family プロパティ内にGo テンプレートの変数が埋め込まれたHTML
  3. 期待される出力: エスケープ処理後の期待値

入力データの解析

入力テンプレートは以下のような構造になっています:

<a style="font-family: '{{"/**/'\";:// \\"}}', &quot;{{"/**/'\";:// \\"}}&quot;">

この中で {{"/**/'\";:// \\"}} というGo テンプレートの変数が2箇所に出現しています。この文字列には以下の特殊文字が含まれています:

  • / (スラッシュ)
  • * (アスタリスク)
  • ' (シングルクォート)
  • " (ダブルクォート)
  • ; (セミコロン)
  • : (コロン)
  • \ (バックスラッシュ)

エスケープ結果の変化

変更前後での主な差異は、\2f\2f の後のスペース文字の数です:

変更前: \2f\2f \\ (スペース1つ) 変更後: \2f\2f \\ (スペース2つ)

これは、CSS エスケープアルゴリズムにおいて、連続する区切り文字やスペースの処理方式が変更されたことを示しています。

セキュリティへの影響

この変更は、CSS インジェクション攻撃を防ぐためのエスケープ処理の精度向上を目的としています。適切なエスケープにより、悪意のあるユーザー入力がCSS コードとして解釈されることを防ぎます。

関連リンク

参考にした情報源リンク