15

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

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

OWASPは、エスケープする文字が他にもあると述べています。

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

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

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

私の逃げ道は十分なのだろうか。この投稿を読みましたが、自分の懸念についてまだよくわかりません。

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

4

2 に答える 2

34

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する統合が追加されています。

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

于 2012-01-18T12:41:18.493 に答える
3

HTML をエスケープするための例として、Appache Common Lang ライブラリを使用して文字列をエスケープすることをお勧めします。

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

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

于 2012-01-18T12:16:18.030 に答える