2012-01-18 24 views
10

ユーザ入力があります。私のコードの中で、私は次のようにエスケープされて歌うことを確認してください:私が読んXSSを防ぐためにHTMLエンティティをエスケープする

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

OWASPでは、エスケープするために多くの文字があること。属性について

私はエスケープの別の種類の操作を行います。すべての属性が「で囲まれていることを、保証されている

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

をこれは私のhtml-属性についての私は確認しますが、いないHTML自体について

。私のエスケープが十分であれば

私は、疑問に思う。私はthis postを読んだが、私はまだ私の懸念についてはよく分からない。

(のJavaScriptがOWASP-図書館でエスケープされている)

+0

'' - ''と '% - >(%XSSの場合、%34などの文字をエンコードする場合) –

+0

@JoopEggen '%'を '&perc;'に置き換えるのがどのような場合に便利でしょうか? – Gumbo

+0

@Gumbo '&perc;'は、XSSに対して実際にはあまり役に立ちませんが、URLを難読化できます。ブラウザはcharに対して%コードを使用しません。つまり、 ''はjavascriptを呼び出しません。 –

答えて

25

私が使用し、ディスプレイの種類ごとに文字列をエスケープするために、同様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> 

更新()

ESAPIエンコーダは、legacy、より良い代替策が作成され、積極的に維持されているので、代わりにOWASP Java Encoderを使用することを強く推奨します。

プロジェクトですでにESAPIが使用されている場合は、integrationが追加されました。このライブラリを使用してエンコードに使用できます。

使い方は自分wiki pageに説明したが、完成のために、これは文脈あなたのデータエンコードするためにあなたがそれを使用する方法である。

// 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を

<div data-attr="<%= htmlAttr %>" onclick="alert('<%= jsAttr %>')"> 
    <%= html %> 
</div> 
(JSPを想定します)

PS:より多くの文脈が存在し、ライブラリによってサポートされています

+0

私が言及したように、OWASPを使用してJavascript-Stringsをエスケープします。しかし、私はapache cocoonによって生成されるいくつかのレガシーコードを持っています。このコードは、私が説明したようにエスケープしています。私の質問です:それは十分なエスケープですか?そうでない場合(そしてそうでない場合に限って)、〜200のXSL-Stylesheetを1行ずつ修正する必要があります。 –

+0

imho、私はそれが十分であるとは思わない、ちょうどこのサイト(http://ha.ckers.org/xss.html)をチェックすることで、エスケープが十分ではないと判断することができます – epoch

+0

そのリソースをありがとう。 –

1

私はHTMLをエスケープするexmapleのために、あなたは、文字列をエスケープするAppache共通ラングライブラリを使用することをお勧めします。

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

ライブラリはHTML、XML、JavaScriptで脱出するために多くの便利なメソッドがあります。

+0

私はESAPIと同じように意図的に悪意のある入力があるかどうかを一般的なlangライブラリがテストしているとは思わない。 – avgvstvs

+5

実際には、StringEscapeUtilsは一重引用符 ''を' ' 'にエスケープしないので、XSSを防ぐためのHTMLエスケープには向いていません –

関連する問題