web-dev-qa-db-ja.com

HTML 5ではどの文字をエスケープする必要がありますか?

HTML 4はかなり どの文字 をエスケープする必要があると述べています:

4つの文字エンティティ参照は、特別な文字をエスケープするために頻繁に使用されるため、特別な言及に値します。

  • 「lt;」 <記号を表します。
  • 「gt;」 >記号を表します。
  • 「amp;」記号を表します。
  • 「quot;は」マークを表します。

テキストに「<」文字を挿入する場合は、「lt;」を使用する必要があります(ASCII 10進数60)タグの開始との混乱を避けるため(開始タグのオープン区切り文字)。同様に、著者は「gt;」を使用する必要があります(ASCII 10進数62)テキストの ">"の代わりに、引用された属性値に表示されるときにタグの終わり(タグクローズ区切り文字)として誤って認識する古いユーザーエージェントの問題を回避します。

著者は「amp;」を使用する必要があります(ASCII 10進数38)文字参照(エンティティ参照のオープン区切り文字)の先頭との混乱を避けるため、 ""の代わりに。著者は「amp;」も使用する必要がありますCDATA属性値内で文字参照が許可されているため、属性値で。

一部の著者は、文字エンティティ参照「引用」を使用しています。その文字は属性値を区切るために使用される可能性があるため、二重引用符( ")のインスタンスをエンコードします。

HTML 5にこのようなものが見つからないことに驚いています。grepの助けを借りれば、 非推奨のXMP要素 に関して、XML以外の言及が見つかるだけです。

代わりにpreとコードを使用し、「<」と「」の文字を「lt;」としてエスケープしますおよび「amp;」それぞれ。

この問題の公式情報源をいくらか指摘できますか?

20
ezequiel-garzon

仕様は通常の要素の構文を定義します

通常の要素には、テキスト、文字参照、他の要素、およびコメントを含めることができますが、テキストに文字U + 003C LESS-THAN SIGN(<)またはあいまいなアンパサンドを含めることはできません。一部の通常の要素には、コンテンツモデルやこの段落で説明されている制限によって課せられる制限を超えて、保持できるコンテンツにさらに多くの制限があります。これらの制限について以下に説明します。

したがって、<、または 文字参照を開始できるもの が続く場合は、&をエスケープする必要があります。アンパサンドの規則は、引用符で囲まれた属性の唯一の規則です。一致する引用符が1つを終了する唯一のものです。 (明らかに、そこで属性値を終了したくない場合は、引用符をエスケープします。)

これらのルールは、<script>および<style>には適用されません。それらに動的なコンテンツを入れないでください。 (する必要がある場合<script>にJSONを含める場合、<\x3cに置き換え、U + 2028 JSONシリアル化後の\u2028の文字、および\u2029のU + 2029。

8
Ry-

から http://www.w3.org/html/wg/drafts/html/master/single-page.html#serializing-html-fragments

文字列のエスケープ(上記のアルゴリズム*の目的のため)は、次のステップを実行することから成ります:

  1. 「」文字の出現を文字列「amp;」に置き換えます。
  2. U + 00A0 NO-BREAK SPACE文字の出現箇所を文字列「nbsp;」に置き換えます。
  3. アルゴリズムが属性モードで呼び出された場合は、出現する「」文字をストリング「quot;」に置き換えます。
  4. アルゴリズムが属性モードで呼び出されなかった場合、「<」文字の出現をストリング「lt;」に置き換え、「>」文字の出現をストリング「gt;」に置き換えます。

*Algorithmは、たとえばinnerHTMLゲッターによって。

厳密に言えば、これは構文解析ではなく直列化を扱うため、質問に対する正確な答えではありません。しかし一方で、シリアル化された出力は安全に解析できるように設計されています。そのため、マークアップを記述するときの含意により:

  1. &文字は&amp;に置き換える必要があります
  2. 改行しないスペースは&nbsp;としてエスケープする必要があります(驚き!...)
  3. 属性内で、"&quot;としてエスケープする必要があります
  4. 属性以外では、<&lt;としてエスケープし、>&gt;としてエスケープする必要があります

パーサーは上記の違反を修正できる可能性があるため、意図的に「必須」ではなく「すべき」と書いています。

4

物事はそれほど簡単ではないと主張するために私の声を追加します-厳密に言えば:

ケース1:HTMLシリアル化

(最も一般的な)

HTML5をHTMLとしてシリアル化する場合、 "テキストに文字U + 003C LESS-THAN SIGN(<)またはあいまいなアンパサンドを含めることはできません。"

あいまいなアンパサンドは "アンパサンドの後に1つ以上の英数字ASCII文字、その後にU + 003Bセミコロン文字(;)" が続く

さらに、 "属性内の特定の名前付き文字参照の解析は、セミコロンを省略しても省略されます。"

そのため、その場合、editable && copy(&&の前後のスペースに注意)は、アンパサンドの後に文字が続かないため、HTML構成としてシリアル化された有効なHTML5です。

反例として:最後のシーケンスeditable&&copy&copyのエンティティ参照として解釈される可能性があるため、©は安全ではありません(これが機能する場合でも)。

ケース1:XMLシリアル化

(あまり一般的ではない)

ここでは、古典的なXMLルールが適用されます。たとえば、テキストまたは属性内のすべてのアンパサンドは、&amp;としてエスケープする必要があります。

その場合、&&(スペースの有無にかかわらず)は無効なXMLです。 &amp;&amp;と書く必要があります

トリッキーですね。

3
Sylvain Leroux