まず第一に、これは今のところ問題なく機能しているように見える単なる POC です。基本的に、この種のソリューションについてどう思うか知りたいです。
問題:
私はこのアプリに多くの EL コードを使用していますが、これまでのところ、XSS エラーを防止することになっています (ただし、修正する唯一のものという意味ではありません) には、EL コンテキストでの XSS の防止のみが含まれます。
以下のコードは jsp ページにあります。
This is your car color ${car.color}
car オブジェクトは次のように設定されます。
ModelAndView mv = new ModelAndView("page3");
String xss = "<script>window.alert('XSS!!');</script>";
Car c = new Car(xss);
mv.addObject("car", c);
return mv;
このようにして、警告メッセージがポップアップするはずです。ここでは何も新しいことはありません...
私の提案(これは機能しています)は次のとおりです
This is your car color${car.color.preventXSS}
これは、すべての文字列に preventXSS プロパティを「追加」するようなものです (文字列クラスは変更していません)。基本的に次のようなカスタム EL リゾルバーを使用してこれを実現しています。
try {
value = context.getELResolver().getValue(context, base, property);
} catch (PropertyNotFoundException e) {
if ((base instanceof String) && property.equals(PREVENT_XSS)) {
context.setPropertyResolved(true);
value = ESAPI.encoder().encodeForHTML(base.toString());
}
}
この場合、'base' には値が<script>window.alert('XSS!!');<;/script>
あり、'PREVENT_XSS' は EL 式の最後のプロパティである 'preventXSS' の定数です。
ところで、私は XSS を処理するために OWASP esapi エンコーダーを使用しています。必要に応じて、encodeForHTMLAttribute や OWASP の esapi がサポートする他の多くのエンコーディングを追加することで改善できます。
注 1: EL 関数を使用して同じことを達成できることはわかっていますが、すべてのページに jsp taglib ディレクティブを含めることなく、'property' preventXSS を追加したかっただけです。
c:out
注 2: jstl タグについても知っています。