web-dev-qa-db-ja.com

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

それらはXMLと同じものでしょうか、それともおそらくスペース1( )なのでしょうか。

HTMLエスケープ文字の巨大なリストを見つけましたが、をエスケープしなければならないとは思いませんをエスケープするために必要なものを知りたい。

208
Ahmet

テキストコンテンツが予想される場所にドキュメントのテキストコンテンツを挿入している場合1通常は、XMLの と同じ文字をエスケープするだけで済みます。要素の内部には、これにエンティティエスケープアンパサンド&と、要素区切り記号の小なり記号と大なり記号<>が含まれるだけです。

& becomes &amp;
< becomes &lt;
> becomes &gt;

属性値の内側では、使用している引用符もエスケープする必要があります。

" becomes &quot;
' becomes &#39;

場合によっては、これらの文字の一部をエスケープするのをスキップするのが安全かもしれませんが、私はあなたがミスをする可能性を減らすためにあなたがすべての場合に逃げることを勧めます。

ASCIIエンコード文書で絵文字を使用しようとしている場合のように、使用しているすべての文字が文書エンコードでサポートされていない場合は、それらをエスケープする必要もあります。最近のほとんどの文書は、Unicodeを完全にサポートするUTF-8エンコーディングを使用してエンコードされていますが、これは不要です。

一般に、スペースを&nbsp;のようにエスケープしないでください。 &nbsp;は通常のスペースではなく、 改行なしのスペース です。通常のスペースの代わりにこれらを使用して、2つの単語の間に改行が挿入されないようにしたり、自動的に折りたたまれずに余分なスペースを挿入したりできますが、これは通常稀なケースです。設計上の制約がない限り、これを行わないでください。


1 「テキストコンテンツが予想される場所」とは、通常の解析規則が適用される要素または引用符で囲まれた属性値の内側を意味します。例えば、<p>HERE</p>または<p title="HERE">...</p>です。私が上で書いたものは、スクリプトやスタイルタグの中、要素名や属性名のように特別な構文解析規則や意味を持つコンテンツには適用されません。例えば、<NOT-HERE>...</NOT-HERE><script>NOT-HERE</script><style>NOT-HERE</script>、または<p NOT-HERE="...">...</p>です。

このような状況では、ルールはより複雑になり、セキュリティの脆弱性を導入するのがはるかに簡単になります。 これらの場所に動的コンテンツを挿入することは絶対にお勧めできません。これらの値を正しくエンコードしたと仮定して、有能なセキュリティ対応開発者のチームが脆弱性を導入するのを見ました。 Edgeケースがありません。動的な値を属性に入れてからJavaScriptで処理するなど、通常はより安全な方法があります。

必要であれば、 Open WebアプリケーションセキュリティプロジェクトのXSS防止規則 を読んで、覚えておく必要がある懸念のいくつかを理解してください。

250
Jeremy

状況によって異なります。 HTMLで考えられるいくつかのコンテキスト:

  • 文書本体
  • 共通属性内
  • スクリプトタグ内
  • 内部スタイルタグ
  • さらにいくつか!

OWASPの クロスサイトスクリプティング防止チートシート 、特に " なぜ信頼できないデータをHTMLエンティティでエンコードできないのかを見る? "と" XSS防止規則 "のセクション。ただし、文書全体を読むことをお勧めします。

20
daxelrod

基本的に、3つの主な文字があります。これらは、HTMLファイルとXMLファイルでは常にエスケープする必要があります。したがって、他のマークアップとは相互作用しません。そのうちの2つは<>であるシンタックスラッパーになります。それらは以下のようにリストされます:

 1)  &lt; (<)

 2)  &gt; (>)

 3)  &amp; (&)

また、二重引用符( ")を"として使用し、一重引用符( ')を&aposとして使用することもできます。

動的コンテンツを<script>および<style>に入れることは避けてくださいこれらの規則はそれらには適用されません。たとえば、aにJSONを含める必要がある場合は、JSONのシリアル化後に<を\ x3cに、U + 2028を\ u2028に、U + 2029を\ u2029に置き換えます。)

HTMLエスケープ文字:完全なリスト: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

そのため、文字参照を開始する可能性があるものが後に続く場合は、<、または&をエスケープする必要があります。また、引用符で囲まれた属性は、アンパサンドの規則だけがそのような規則になります。ただし、属性値をそこで終了したくない場合は、引用符をエスケープします。

UTF-8に変更すると、ファイルが再保存されます。

あなたのページに文字エンコーディングUTF-8を使用することは、あなたがほとんどのエスケープの必要性を避け、単に文字を扱うことができることを意味します。ただし、ドキュメントのエンコーディングを変更するためには、ページ上部またはサーバー上でエンコーディング宣言を変更するだけでは不十分です。あなたはそのエンコーディングであなたの文書を再保存する必要があります。アプリケーションでこれを行う方法を理解するためには、Webオーサリングアプリケーションでのエンコーディングの設定を読んでください。

見えないかあいまいな文字:

エスケープの特に有用な役割は、表示では見えないかあいまいな文字を表すことです。

一例は、ユニコード文字U + 200Fの右から左へのマークであろう。この文字は、双方向テキストの方向性を明確にするために使用できます(たとえば、アラビア語またはヘブライ語のスクリプトを使用する場合)。ただし、グラフィック形式はありません。したがって、これらの文字がテキスト内のどこにあるのかを確認するのは困難です。また、文字を紛失したり忘れたりすると、後で編集するときに予期しない結果が生じる可能性があります。代わりに(またはそれに相当する数字参照)を使用すると、これらの文字を見つけやすくなります。

あいまいな文字の例は、U + 00A0 NO-BREAK SPACEです。このタイプのスペースは改行を防ぎますが、文字として使用すると他のスペースとまったく同じように見えます。を使用すると、そのようなスペースがテキストのどこに表示されるかが明確になります。

8
Alireza

正確な答えは文脈によって異なります。一般に、これらの文字は存在してはいけません( HTML 5.2§3.2.4.2.5 )。

テキストノードと属性値は、Unicode文字で構成する必要があります。U+ 0000文字を含めることはできません。永続的に未定義のUnicode文字(文字以外)を含めることはできません。この仕様には、テキストノードの正確な値とその正確なコンテキストに応じた属性値に対する追加の制約が含まれています。

HTMLの要素の場合、Textコンテンツモデルの制約は要素の種類によっても異なります。たとえば、textarea要素はエスケープ可能な生のテキスト要素であるため、textarea要素内の "<"をHTMLでエスケープする必要はありません。

これらの制限は仕様全体に分散しています。例えば、属性値( §8.1.2.3 )は あいまいなアンパサンド を含んではならず、(iempty、(ii)を一重引用符で囲みます(したがってU + 0027アポストロフィ文字'を含めることはできません)、(iii)は二重引用符で囲みます(U + 0022引用符文字"を含めることはできません)、または(iv)unquoted - 以下の制限付き。

...リテラルスペース文字、U + 0022引用符文字( ")、U + 0027アポストロフィ文字( ')、U + 003D等号文字(=)、U + 003C小なり記号() <)、U + 003E記号よりも大きい記号(>)、またはU + 0060アクセント記号を重大な文字( ')で指定します。空の文字列であってはなりません。

1
Andrey