Java El和持久性XSS

时间:2012-12-19 18:26:00

标签: xss el

首先,这只是一个目前似乎工作正常的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}

这意味着像在每个String“添加”一个preventXSS属性(我不修改String类),我通过自定义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'是'preventXSS'的常量,它是EL表达式中的最后一个属性。

BTW我正在使用OWASP esapi编码器来处理XSS,如果需要,可以通过添加其他不同的编码来改进,例如encodeForHTMLAttribute和OWASP的esapi支持的许多其他编码。

note1:我知道我可以使用EL函数来实现相同的功能,但我想在每个页面中添加“属性”preventXSS而不必包含jsp taglib指令。

note2:我也知道c:out jstl标签。

1 个答案:

答案 0 :(得分:0)

是的,您提出的解决方案是有效的,但是我看到的一个问题是,由于不符合EL标准,附加属性在维护时可能会造成混淆。如果您使用的是Spring MVC,可以查看以下方法来防止XSS:

Referece 1

Referece 2

Referece 3