web-dev-qa-db-ja.com

XSS防止のためのURLEncodeとHTMLEncode

プログラマーがコンテンツをHTMLEncodeではなくHTMLの一部として出力するためにURLEncodeを使用した(Javaの)1つのプロジェクトがあります。

XSS脆弱性のリスクは何ですか? (エンコードが異なると、結果が異なることを忘れましょう)

JavaでHTMLEncodeを実行する正しい方法は何ですか?

6
AaronS

リスク評価URLEncodedデータがHTMLコンテキストに挿入されている場合(タグ間など)、XSS攻撃を導入する方法がわかりません。 URLEncodeは、<>、および&文字をエスケープします(それぞれ%3C%3E、および%26に)。最近のブラウザーでは、タグの間に挿入された値のXSSを防ぐにはこれで十分だと思います。

攻撃が可能であるかもしれないいくつかのもっとあいまいなケースがあります。信頼できない(ただしURLEncodedの)データを、URL(AタグのHREF属性など)、JavaScript、CSSなどの他の解析コンテキストに導入している場合でも、XSS攻撃が可能である可能性があります。 URLEncodeを使用します。それにもかかわらず、これらのコンテキストはあまり一般的ではないので、それらはあなたが話していることではないと思います。

つまり、簡単に言うと、これは(私が見る限り)XSSに対して脆弱である可能性は低いです。

なぜそれをしてはいけないのか。それでも、私が認識しているように、URLEncodeは明らかにこの問題の間違った解決策です。誤った方法でデータをエスケープし、ユーザーがブラウザーでデータを表示すると、データが破損します。 URLEncodeは使用しないでください。それは仕事にとって間違った道具です。代わりに、使用するHTMLコンテキストに適切なエスケープ関数を使用してください。

それを適切に行う方法。適切なエスケープ関数を選択する方法、およびそのエスケープ関数の実装を取得する場所については、 他の場所での私の議論 を参照してください。たとえば、 OWASP ESAPI は、XSSの脆弱性を防止するために使用できるHTMLエスケープ関数でいっぱいのすばらしいライブラリです。

9
D.W.