14

私のレガシー プロジェクトでは、文字列がブラウザに送信される前に、escapeHtml の使用を確認できます。

StringEscapeUtils.escapeHtml(stringBody);

私はapi docからescapeHtmlが何をするかを知っています.hereは与えられた例です:-

For example: 
"bread" & "butter"
becomes: 
"bread" & "butter".

私の理解では、html をエスケープした後に文字列を送信すると、元の文字に変換するブラウザの責任になります。そうですか?

しかし、なぜ、いつ必要なのかがわかりません.htmlをエスケープせずに文字列の本文を送信するとどうなりますか? ブラウザに送信する前に escapeHtml を実行しない場合のコストはいくらですか

4

4 に答える 4

18

文字列がエスケープされない場合がある理由を説明するには、いくつかの可能性を考えることができます。

  • おそらく元のプログラマーは、特定の場所で文字列に特殊文字が含まれていないことを確信していたでしょう (ただし、私の意見では、これはプログラミングの悪い方法です。将来の変更に対する保護として文字列をエスケープするコストはほとんどかかりません)。
  • 文字列は、コードのその時点ですでにエスケープされています。文字列を 2 回エスケープしたくないことは間違いありません。ユーザーには、意図したテキストではなくエスケープ シーケンスが表示されることになります。
  • 文字列は実際の html そのものでした。html をエスケープしたくありません。ブラウザに処理させたい!

編集 - エスケープする理由は、 や のような特殊文字が&ブラウザ<に意図したものとは異なるものを表示させる可能性があるためです。ベア&は、技術的には html のエラーです。ほとんどのブラウザーは、このようなエラーをインテリジェントに処理しようとし、ほとんどの場合、エラーを正しく表示します。(たとえば、文字列が のテキストである場合、例のテキストでこれがほぼ確実に発生し<div>ます。) ただし、これは不適切なマークアップであるため、一部のブラウザーではうまく機能しません。支援技術 (テキスト読み上げなど) は失敗する可能性があります。そして、他の問題があるかもしれません。

ブラウザーが不適切なマークアップから回復するために最善を尽くしたにもかかわらず、失敗するケースがいくつかあります。サンプル文字列が属性値である場合、引用符をエスケープすることが絶対に必要になります。ブラウザが次のようなものを正しく処理する方法はありません。

<img alt=""bread" & "butter"" ... >

一般的な規則として、マークアップではないがマークアップと混同される可能性のある文字はエスケープする必要があります。

HTML ドキュメント内にテキストを表示できるコンテキストがいくつかあり、それぞれにエスケープの要件があることに注意してください。以下はエスケープする必要があります。

  • ドキュメントの文字セットで表現されていないすべての文字 (UTF-8 を使用している場合はありそうにありませんが、常にそうとは限りません)
  • 属性値内では、引用符 ('または"、属性値自体に使用される区切り文字と一致する方) とアンパサンド ( &) を使用しますが、<
  • テキスト ノード内では、&および<
  • href 値内で、URL でエスケープする必要がある文字 (ブラウザが一度エスケープ解除した後もエスケープされるように、二重にエスケープする必要がある場合があります)
  • CDATA ブロック内では、通常 (HTML レベルでは) 何もありません。

最後に、二重エスケープの危険性は別として、すべてのテキストをエスケープするコストは最小限です。わずかな追加処理とネットワーク上の数バイトの追加です。

于 2013-02-08T04:42:38.057 に答える
3

HTML (現在では XML と呼ぶ方が適切です) では、いわゆる「特殊」文字が多数定義されています。つまり、これらの文字は、それ自体を意味する「通常の」文字とは対照的に、ブラウザーにとって特別な意味を持つことを意味します。たとえば、文字列"Hello, World!"には「通常の」文字のみが含まれているため、文字通り"Hello, World!"ブラウザーを意味します。String "<b>Hello, World!</b>"、特殊文字'<''>'およびが含まれています。'/'ブラウザの場合は、.typeset string "Hello, World!" in boldtypeset "<b>Hello, World!</b>"

メソッドescapeHtml (String)はおそらく (どのように実装されているのかわからないため、はっきりとは言えません)、任意の文字列を HTML コードに変換し、ブラウザにこの文字列を文字通りタイプセットするように指示します。たとえば、escapeHtml ("<b>Hello, World!</b>")ブラウザによってtypeset "<b>Hello, World!</b>" normally代わりにとして解釈される HTML コードを返しますtypeset string "Hello, World!" in bold。メソッドescapeHtml (String)が正しく実装されていれば、このメソッドによって生成された HTML コードがどのように見えるかを気にする必要はありません。文字列を文字どおりにタイプセットするようにブラウザに要求する場合に使用します。

于 2013-02-08T04:50:54.840 に答える
2

ページで生成された html (jsp を読む) と一緒に解釈される可能性がある場合は、html または xml をエスケープする必要があります。

この良い質問もそれを説明しています。

于 2013-02-08T04:41:33.297 に答える
1

私の経験から、ページに表示する前に、すべての文字列を Html からエスケープする必要があります。現在のプロジェクトは、Active Directory からすべての組織単位を管理することであり、これらの単位には任意の特殊文字 (Html 文字を含む) を含めることができます。ページに表示するとき、次のコードで、というレコードを表示することになる可能性があります。User <Marketing>

<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a>

ページがレンダリングされると、

<a href="viewDetail.do"> User <Marketing> </a>

実際Userにはページ上にハイパーリンクとして表示されます。

ただし、ページに送信する前に Html 値をエスケープすると、

request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>"));

ページがレンダリングされると、

 <a href="viewDetail.do"> User &lt;Marketing&gt; </a>

JSPページに正しく表示されます

すぐに、Html 文字のエスケープを使用して特殊な入力を防ぎます。入力に ​​Html 文字が含まれていると、レンダリング中にページが正しく表示されません

于 2013-02-08T04:53:05.923 に答える