333

それらはXMLと同じですか、おそらくスペース1( )を加えたものですか?

HTMLエスケープ文字の膨大なリストをいくつか見つけましたが、エスケープする必要はないと思います。何を逃れる必要があるのか​​知りたい。

4

5 に答える 5

422

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

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

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

" becomes &quot;
' becomes &#39;

場合によっては、これらの文字の一部をエスケープすることをスキップしても安全な場合もありますが、間違いを犯す可能性を減らすために、すべての場合で5つすべてをエスケープすることをお勧めします。

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</style><p NOT-HERE="...">...</p>

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

必要な場合は、Open Web Application Security ProjectのXSS防止ルールを読んで、覚えておく必要のあるいくつかの懸念事項を理解してください。

于 2011-09-11T23:34:01.467 に答える
21

それは文脈に依存します。HTMLで考えられるいくつかのコンテキスト:

  • ドキュメント本文
  • 共通属性の内部
  • スクリプトタグ内
  • スタイルタグの内側
  • さらにいくつか!

OWASPのクロスサイトスクリプティング防止に関するチートシート、特に「HTMLエンティティだけで信頼できないデータをエンコードできないのはなぜですか?」および「XSS防止ルール」のセクションを参照してください。ただし、ドキュメント全体を読むことをお勧めします。

于 2011-09-12T01:06:36.033 に答える
11

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

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

また、二重引用符( ")を"として使用し、一重引用符(')を&aposとして使用する場合があります。

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

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

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

UTF-8に変更すると、ファイルを再保存できます

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

目に見えない、またはあいまいな文字:

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

1つの例は、Unicode文字U + 200FRIGHT-TO-LEFTMARKです。この文字は、双方向テキストの方向性を明確にするために使用できます(たとえば、アラビア語またはヘブライ語のスクリプトを使用する場合)。ただし、グラフィック形式がないため、これらの文字がテキストのどこにあるかを確認することは困難であり、それらが失われたり忘れられたりすると、後の編集中に予期しない結果が生じる可能性があります。代わりに(またはそれに相当する数値文字参照)を使用すると、これらの文字を簡単に見つけることができます。

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

于 2017-05-02T12:42:09.703 に答える
3

正確な答えはコンテキストによって異なります。一般に、これらの文字は存在してはなりません(HTML5.2§3.2.4.2.5):

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

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

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

...リテラルスペース文字、U + 0022引用符文字( ")、U + 0027アポストロフィ文字(')、U + 003D等号文字(=)、U + 003C LESS-THAN SIGN文字( <)、U + 003E GREATER-THAN SIGN文字(>)、またはU + 0060 GRAVE ACCENT文字( `)であり、空の文字列であってはなりません。

于 2018-04-11T02:27:50.657 に答える
0

JavaScriptを使用してマークアップの文字列をエスケープする場合は、次のようになります。

または、依存関係を取得したくない場合は、同じことを行いますが、のsplit/map/join代わりにを使用するため、少し遅くなりますcharCodeAt/substring

function escapeMarkup (dangerousInput) {
  const dangerousString = String(dangerousInput);
  const matchHtmlRegExp = /["'&<>]/;
  const match = matchHtmlRegExp.exec(dangerousString);
  if (!match) {
    return dangerousInput;
  }

  const encodedSymbolMap = {
    '"': '&quot;',
    '\'': '&#39;',
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;'
  };
  const dangerousCharacters = dangerousString.split('');
  const safeCharacters = dangerousCharacters.map(function (character) {
    return encodedSymbolMap[character] || character;
  });
  const safeString = safeCharacters.join('');
  return safeString;
}
于 2022-02-14T22:38:46.723 に答える