レッスン 3
CMS とテンプレートにおけるエンティティ
テキストノード、属性、エクスポートフィールドをいつエスケープするか。
CMS プラットフォームとテンプレートエンジンはコンテンツを自動エスケープすることが多い—ただし期待するレイヤーで常にではありません。
テキストノード vs 属性
HTML テキストノードでは、重要なエスケープは通常 <、>、& です。
属性値 では、属性が " や ' で区切られているとき引用符もエスケープが必要です。title="..." 内の He said "hi" は引用符をエンコードしないと属性を壊します。
二重エンコードの罠
よくあるバグチェーン:
- CMS が
Tom & Jerryを保存(すでにエスケープ済み) - テンプレートエンジンが再エスケープ →
Tom &amp; Jerry - ページにリテラル
&テキストが表示され&にならない
修正: 信頼できないテキストが HTML に入る境界で 1 回だけ エスケープ。データがすでにエンティティエンコード済みなら、次のエスケープ pass の前にデコードするか safe としてマーク。
リッチテキスト vs プレーンフィールド
リッチテキストエディタはエンティティがすでに埋め込まれた HTML 断片を出力することがあります。プレーンテキストフィールドは出力時に完全エスケープが必要なことがあります。1 パイプラインで混在すると表示が不整合になります。
メールとエクスポート形式
CSV エクスポート、JSON API、メールテンプレートは XML/HTML 互換のためエンティティエンコードすることがあります。そのデータを Web ページに import するとき、consumer が生テキストか事前エスケープ HTML を期待するか確認してください。
フレームワークの自動エスケープ
React、Vue、モダンテンプレートシステムはテキスト補間 API 使用時にデフォルトでエスケープします。手動の dangerouslySetInnerHTML や raw テンプレートブロックはその保護をバイパス—エンティティと sanitize は自分の責任になります。