レッスン 3

CMS とテンプレートにおけるエンティティ

テキストノード、属性、エクスポートフィールドをいつエスケープするか。

CMS プラットフォームとテンプレートエンジンはコンテンツを自動エスケープすることが多い—ただし期待するレイヤーで常にではありません。

テキストノード vs 属性

HTML テキストノードでは、重要なエスケープは通常 <>& です。

属性値 では、属性が "' で区切られているとき引用符もエスケープが必要です。title="..." 内の He said "hi" は引用符をエンコードしないと属性を壊します。

二重エンコードの罠

よくあるバグチェーン:

  1. CMS が Tom &amp; Jerry を保存(すでにエスケープ済み)
  2. テンプレートエンジンが再エスケープ → Tom &amp;amp; Jerry
  3. ページにリテラル &amp; テキストが表示され & にならない

修正: 信頼できないテキストが HTML に入る境界で 1 回だけ エスケープ。データがすでにエンティティエンコード済みなら、次のエスケープ pass の前にデコードするか safe としてマーク。

リッチテキスト vs プレーンフィールド

リッチテキストエディタはエンティティがすでに埋め込まれた HTML 断片を出力することがあります。プレーンテキストフィールドは出力時に完全エスケープが必要なことがあります。1 パイプラインで混在すると表示が不整合になります。

メールとエクスポート形式

CSV エクスポート、JSON API、メールテンプレートは XML/HTML 互換のためエンティティエンコードすることがあります。そのデータを Web ページに import するとき、consumer が生テキストか事前エスケープ HTML を期待するか確認してください。

フレームワークの自動エスケープ

React、Vue、モダンテンプレートシステムはテキスト補間 API 使用時にデフォルトでエスケープします。手動の dangerouslySetInnerHTML や raw テンプレートブロックはその保護をバイパス—エンティティと sanitize は自分の責任になります。

実践したいときは関連する DevCove ツールを使えます。任意であり、このレッスンの必須部分ではありません。

関連ツールを開く

コース概要へ戻る