web-dev-qa-db-ja.com

XSSを防ぐためのHTMLエンティティのエスケープ

ユーザー入力があります。コード内で、次のシンボルがエスケープされていることを確認します。

& -> & 
< -> &lt; 
> -> &gt;

[〜#〜] owasp [〜#〜] エスケープする文字がまだあることを示します。

属性については、別の種類のエスケープを行います。

& -> &amp; 
" -> &quot;

これにより、すべての属性が「」で囲まれることが保証されます。これにより、HTML自体についてではなく、html属性について確認できます。

逃げるだけで十分かしら。 この投稿 を読みましたが、自分の懸念についてはまだわかりません。

(JavaScriptはOWASP-Libraryでエスケープされます)

12

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:より多くのコンテキストが存在し、ライブラリによってサポートされています

31
epoch

文字列をエスケープするには、Apache Common Langライブラリを使用することをお勧めします。たとえば、HTMLをエスケープするには、次のようにします。

String escapedString = org.Apache.commons.lang.StringEscapeUtils.escapeHtml(String str);

ライブラリには、HTML、XML、Javascriptでエスケープするための多くの便利なメソッドがあります。

2
e-zinc