首先,这只是一个到目前为止似乎运行良好的 POC,基本上我想知道您对这种解决方案的看法。
问题:
我有这个包含大量 EL 代码的应用程序,现在我应该防止 XSS 错误,我目前的解决方案(但这并不意味着它是我要修复的唯一问题)只涉及在 EL 上下文中防止 XSS。
下面的代码在一个jsp页面中:
This is your car color ${car.color}
汽车对象设置如下:
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 属性(我没有修改 String 类),我通过一个自定义的 EL Resolver 来实现这一点,基本上如下
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' 是 'preventXSS' 的常量,它是我们 EL 表达式中的最后一个属性。
顺便说一句,我正在使用 OWASP esapi 编码器来处理 XSS,如果需要,可以通过添加其他不同的编码(如 encodeForHTMLAttribute 和 OWASP 的 esapi 支持的许多其他编码)来改进这一点。
note1:我知道我可以使用 EL 函数来实现相同的目的,但我只想添加“属性”preventXSS,而不必在每个页面中都包含 jsp taglib 指令。
note2:我也知道 jstlc:out
标签。