HTML特殊文字のエスケープとエンティティエンコーディング
名前付きエンティティ、数値参照、16進参照を使用したHTMLの特殊文字エスケープ方法を学びます。5つの必須エスケープ、属性エンコーディング、適切なHTMLエスケープによるXSS防止を解説します。
詳細な説明
HTML特殊文字のエスケープ
HTMLは特定の文字を構文の一部として使用します — タグの山括弧、エンティティのアンパサンド、属性のクォートです。これらの文字がコンテンツに出現する場合、ブラウザの誤解釈を防ぐためにエスケープする必要があります。
5つの必須エスケープ
& → & (アンパサンド — エンティティ参照の開始)
< → < (小なり — タグの開始)
> → > (大なり — タグの終了)
" → " (ダブルクォート — 属性値の終了)
' → ' (シングルクォート/アポストロフィ — 属性値の終了)
名前付きエンティティ vs 数値エンティティ
HTMLは3つのエンコーディング形式をサポートしています:名前付きエンティティ(&)、10進数値参照(&)、16進数値参照(&)。名前付きエンティティは可読性が高く、数値参照はあらゆるUnicodeコードポイントをカバーできます。
コンテキスト固有のエスケープ
必要なエスケープはコンテンツの出現場所によって異なります:
- テキストコンテンツ内: 最低限
&と<をエスケープ。 - ダブルクォート属性内: さらに
"もエスケープ。 - シングルクォート属性内: さらに
'もエスケープ。 <script>と<style>内: HTMLエンティティはデコードされません。JavaScriptまたはCSSのエスケープを使用。
XSS対策
適切なHTMLエスケープはクロスサイトスクリプティング(XSS)に対する主要な防御策です。HTMLにエスケープなしで挿入されたユーザー入力は、任意のJavaScriptを実行できます。
ノーブレークスペースと特殊文字
(ノーブレークスペース)はその位置での折り返しを防ぎます。その他の一般的なエンティティには —(emダッシュ)、©(著作権)、€(ユーロ記号)、…(省略記号)があります。
プログラム的なエスケープ
ほとんどのフレームワークには組み込みのHTMLエスケープがあります:ReactはJSXをデフォルトでエスケープし、Djangoは |escape を使用し、PHPには htmlspecialchars() があり、Goは html.EscapeString() を提供しています。
ユースケース
HTMLエスケープはWeb開発の基本です。ユーザー生成コンテンツのレンダリング、メールテンプレートの構築、HTMLレポートの生成、静的サイトジェネレータの作成、HTML属性へのデータ挿入、そしてXSS脆弱性を防ぐために信頼できないテキストをWebページに表示するあらゆるコンテキストで必要です。