0

首先,这只是一个到目前为止似乎运行良好的 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标签。

4

1 回答 1

0

是的,您提出的解决方案有效,但是我看到的一个问题是,由于不遵循 EL 标准,附加属性在维护时可能会令人困惑。如果你使用 Spring MVC,你可以看看以下方法来防止 XSS:

参考 1

参考 2

参考文献 3

于 2012-12-20T01:32:11.233 回答