ユーザー入力があります。コード内で、次のシンボルがエスケープされていることを確認します。
& -> &
< -> <
> -> >
[〜#〜] owasp [〜#〜] エスケープする文字がまだあることを示します。
属性については、別の種類のエスケープを行います。
& -> &
" -> "
これにより、すべての属性が「」で囲まれることが保証されます。これにより、HTML自体についてではなく、html属性について確認できます。
逃げるだけで十分かしら。 この投稿 を読みましたが、自分の懸念についてはまだわかりません。
(JavaScriptはOWASP-Libraryでエスケープされます)
OWASP( [〜#〜] esapi [〜#〜] )ライブラリも使用します。さまざまな種類の表示の文字列をエスケープするには、次を使用します。
String html = ESAPI.encoder().encodeForHTML("hello < how > are 'you'");
String html_attr = ESAPI.encoder().encodeForHTMLAttribute("hello < how > are 'you'");
String js = ESAPI.encoder().encodeForJavaScript("hello < how > are 'you'");
HTML(jspを想定)
<tag attr="<%= html_attr %>" onclick="alert('<%= js %>')"><%= html %></tag>
更新(2017)
ESAPIエンコーダーは レガシー と見なされるため、より良い代替案が作成され、積極的に維持されているため、 OWASP Javaエンコーダー を使用することを強くお勧めします。 =代わりに。
プロジェクトですでにESAPI
が使用されている場合は、 integration が追加されており、代わりにこのライブラリをエンコードに使用できます。
使用法は wikiページ で説明されていますが、完成させるために、これを使用してデータをコンテキストでエンコードする方法を説明します。
// HTML Context
String html = Encoder.forHtml("u<ntrus>te'd'");
// HTML Attribute Context
String htmlAttr = Encoder.forHtmlAttribute("u<ntrus>te'd'");
// Javascript Attribute Context
String jsAttr = Encoder.forJavaScriptAttribute("u<ntrus>te'd'");
HTML(jspを想定)
<div data-attr="<%= htmlAttr %>" onclick="alert('<%= jsAttr %>')">
<%= html %>
</div>
PS:より多くのコンテキストが存在し、ライブラリによってサポートされています
文字列をエスケープするには、Apache Common Langライブラリを使用することをお勧めします。たとえば、HTMLをエスケープするには、次のようにします。
String escapedString = org.Apache.commons.lang.StringEscapeUtils.escapeHtml(String str);
ライブラリには、HTML、XML、Javascriptでエスケープするための多くの便利なメソッドがあります。