2016-02-27 23 views
2

春季控制器集:逃生EL在JSP表示JSON數據

model.addAttribute("myJsonObj", JsonUtils.toJson(myObject)); 

的JSP有類似:

<script> 
    var myObj = ${myJsonObj}; 
    (...) 

如何正確地保護這個從任何XSS漏洞?

將打破JSON(雙引號等)

什麼是避免直接EL在JSP正確的策略?

回答

1

當JSP輸出var myObj = ${myJsonObj};時,其行爲與eval相同,該腳本會導致XSS問題。 解決方案輸出爲${myJsonObj}作爲字符串,因此惡意腳本不會執行。 然後用JSON.parse()將字符串還原爲javascript對象,這樣就不必更改其他腳本。

當輸出${myJsonObj}作爲字符串時,您必須處理雙/單引號字符。 這可以使用JSP定製標記/ EL函數來完成,例如:

var myObj = JSON.parse('<my:escapeEcmaScript value="${myJsonObj}"/>'); 

或做它在春天控制器

model.addAttribute("myJsonObj", StringEscapeUtils.escapeEcmaScript(JsonUtils.toJson(myObject))); 
//In JSP 
//var myObj = JSON.parse('${myJsonObj}'); 
+0

你的意思是寫? – bananasplit

+0

我修改答案並添加更多解釋。 –

+0

我花了最後三個小時試圖弄清楚爲什麼我的有效JSON字符串(在Spring Controller中)在將它分配給JSP中的一個JavaScript變量之後轉換爲無效的JSON字符串。經過一些故障排除和大量研究,我確信我必須逃脫無效符號,但找不到正確的方法,謝謝指出! – Repoker