2011-02-09 20 views
16

エスケープ文字列を処理するための明確なガイドラインや規則を私に提供していただければ幸いです。私がエスケープ文字列のために使用するのは、apacheのcommons-lang-x.x.jarライブラリです。具体的にはStringEscapeUtils.escapeHtml(String toEscape)メソッド。HTML文字列、JSPページ、またはサーブレットはどこからエスケープする必要がありますか?

私が知っている必要があります:

(1)ここで、JSPページまたはサーブレットでは、文字列をエスケープする良いですか?

(2)あなたはStringEscapeUtils.escapeHtml(..)または< C何をお勧めします:

JSTL

から>うち4.2(3)優れている複数行の文字列を、取り扱い、文字列に直接<BR>を使用し、または\ nとnl2br()メソッド:

String strError = "Invalid username.\nPlease try again.";

又は

String strError = "Invalid username.<br>Please try again.";

(4)どのように私は、ワイルドカードを受け取り、文字列をエスケープ行く、一例になります。

String strError = "Invalid user [%s].<br>Please specify another user."

は(5)JavaScriptのエスケープ文字は異なっているので。 JSPページのJavaScriptセクション(例えば、var name = "<%=javaStringHoldingName%>")内でレンダリングされるJava文字列をエスケープするにはどうすればよいですか。ご質問の2については

答えて

15

あなたは害を及ぼす可能性がある場所に正確にエスケープする必要があります。この特定のケースでは、それは視野に入っています。ユーザーが制御するHTMLは、ビュー内のすべてのHTMLの間でインラインになると害を及ぼします。これはXSSのソースです。うまく設計されたJSPページで

(読み:なしscriptlets)を、JSTLは、あなたのHTML/XMLをエスケープする<c:out>タグとfn:escapeXml()機能を提供しています。

<c:out value="${param.foo}" /> 
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" /> 
+0

に応答した最初の回答のコメントセクションの例を読んでください。「無効な範囲[%s]」のようなテンプレート文字列がある場合はどうですか?
英数字のみ"。そして、値が "1 .. <5"であると言うことができます。これはどのようにエスケープ処理されますか? 2行に表示されるため、テンプレート文字列には
が含まれています。 –

+0

基本JSPでは、通常、JSTLの ''を使用します。また、Spring、JSFなどのJSP上で(MVC)フレームワークを使用している場合は、独自のメッセージフォーマットタグをすべて持っています。この偶然の偶然による偶然の質問も参照してください:http://stackoverflow.com/questions/4961558/best-practice-for-translations – BalusC

+0

あなたも知っている通り、 'StringEscapeUtils.escapeHtml(" lala ")を使っても動作します。 ; 'jspで印刷されます。 – Vince

2

:表示用の文字列をエスケープ

1) - 私は、このビューの懸念検討します。 JSPをビューとして使用している場合は、JSPでこれを処理できます。

3)モデル/ビジネスロジック層からのエラーメッセージに改行文字などの書式を含めないでください。エラーメッセージの書式を設定する方法を見てみましょう。 HTMLでは、適切な幅のスタイルを持つdivタグを使用すると、たとえばbrタグが不要になります。

+0

あなたの答えを編集して、3番目の例の例を教えてもらえますか?ちなみに、2番目のポイントはどこですか:) BalusC –

2

私はおそらく、Stringオブジェクトを渡すことはなく、代わりにちょうどビューまでのエラーオブジェクトを渡すと、JSPが、それはコントローラで

を望んでいるものは何でも聞かせ:

errorObj.name = "invalid login"; 
errorObj.description = "try again"; 

表示内:

<c:out value="${errorObj.name}" /><br /><c:out value="${errorObj.description}" /> 

あなたの質問には実際には関係しませんが、それはまた良いですログインエラーが本当に何であっても「無効なログイン試行」のようなメッセージを使用するように練習してください。あなたが与えているメッセージは、「無効なユーザー名」は、あなたのアカウントをハッキングしようとする人に、パスワードを使用するのに使うことができる良いユーザー名を持っているかどうかを知ることができます。これが公に公開されている場合、これは小さくても非常に現実的な問題です。

関連する問題