プログラマーがコンテンツをHTMLEncodeではなくHTMLの一部として出力するためにURLEncodeを使用した(Javaの)1つのプロジェクトがあります。
XSS脆弱性のリスクは何ですか? (エンコードが異なると、結果が異なることを忘れましょう)
JavaでHTMLEncodeを実行する正しい方法は何ですか?
リスク評価URLEncodedデータがHTMLコンテキストに挿入されている場合(タグ間など)、XSS攻撃を導入する方法がわかりません。 URLEncodeは、<
、>
、および&
文字をエスケープします(それぞれ%3C
、%3E
、および%26
に)。最近のブラウザーでは、タグの間に挿入された値のXSSを防ぐにはこれで十分だと思います。
攻撃が可能であるかもしれないいくつかのもっとあいまいなケースがあります。信頼できない(ただしURLEncodedの)データを、URL(AタグのHREF属性など)、JavaScript、CSSなどの他の解析コンテキストに導入している場合でも、XSS攻撃が可能である可能性があります。 URLEncodeを使用します。それにもかかわらず、これらのコンテキストはあまり一般的ではないので、それらはあなたが話していることではないと思います。
つまり、簡単に言うと、これは(私が見る限り)XSSに対して脆弱である可能性は低いです。
なぜそれをしてはいけないのか。それでも、私が認識しているように、URLEncodeは明らかにこの問題の間違った解決策です。誤った方法でデータをエスケープし、ユーザーがブラウザーでデータを表示すると、データが破損します。 URLEncodeは使用しないでください。それは仕事にとって間違った道具です。代わりに、使用するHTMLコンテキストに適切なエスケープ関数を使用してください。
それを適切に行う方法。適切なエスケープ関数を選択する方法、およびそのエスケープ関数の実装を取得する場所については、 他の場所での私の議論 を参照してください。たとえば、 OWASP ESAPI は、XSSの脆弱性を防止するために使用できるHTMLエスケープ関数でいっぱいのすばらしいライブラリです。