2012-12-19 146 views
0

首先,這只是一個POC,目前似乎工作正常,基本上我想知道您對這種解決方案的看法。Java El和持久性XSS

問題:

我有這個程序有很多的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解析器這基本上是如下

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()); 
    } 
} 

實現該「基準」在這種情況下具有值<script>window.alert('XSS!!');<;/script> 而'PREVENT_XSS'是'preventXSS'的常量,它是我們EL表達式中的最後一個屬性。

BTW我使用OWASP ESAPI編碼器處理XSS,如果需要,這可以通過添加其他不同的編碼方式,如encodeForHTMLAttribute和許多其他的是OWASP的ESAPI支持得到改善。

note1:我知道我可以使用一個EL函數來實現,但我只想添加'property'preventXSS,而不必在每個頁面中包含一個jsp taglib指令。

note2:我也知道c:out jstl標籤。

回答

0

是的,你提出的解決方案是有效的,但是我看到的一個問題是,由於沒有遵循EL標準,因此在維護時間附加屬性可能會造成混淆。如果您在使用Spring MVC,你可以看看以下方法來防止XSS:

Referece 1

Referece 2

Referece 3