2013-07-29 67 views
15

我在JSP中顯示的字符串是這樣的:逃生所有字符串在JSP/Spring MVC的

${someString} 

此字符串可以,當然,包含特殊HTML字符。目前有可能HTML注入惡意代碼(例如,如果someString是一個JavaScript包含 - <script src...>)。

如何確保在打印之前所有字符串都被轉義了?

我正在使用Spring MVC和JSP。

+0

是U想要執行的標籤或刪除標籤? – newuser

+0

可能的重複:http://stackoverflow.com/questions/4948532/where-should-i-escape-html-strings-jsp-page-or-servlets –

+0

@newuser我想逃避它,所以用戶看到'腳本「作爲頁面中的文本。 –

回答

22

您可以使用JSTL core

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

使用<c:out value="${someString}"/>標籤顯示的字符串。 <c:out>轉義HTML字符以避免跨站點腳本,您可以通過設置屬性escapeXml=true來指定。另一個優點是,如果value評估爲null,您也可以提供默認值。您可以使用fn:escapeXml() EL功能。你需要包括JSTL functions

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

另一種可能的方式,將建立自定義ELResolver

爲EL表達式評估啓用自定義變量和屬性解析行爲。

This blog提供了一個如何完成的工作示例。


對於整個Spring MVC的應用程序,你可以指定web.xml中退讓:

<context-param> 
    <param-name>defaultHtmlEscape</param-name> 
    <param-value>true</param-value> 
</context-param> 

但隨後的轉義僅適用於spring標記,如:

<form:input path="formField" htmlEscape="true" /> 

最後,您可以嘗試第三方庫XSSFilter

+1

這很好,但我不得不掃描我的JSP中的所有輸出。此外,一個新人可能不知道這是正確的方式。任何自動/全局解決方案? –

+0

@JoshuaMN更新了答案! – NINCOMPOOP

+0

我試圖在窗體上設置'htmlEscape =「true」',但它不會轉義腳本標記,爲什麼? –

0

您也可以使用<spring:htmlEscape defaultHtmlEscape="true" />

+0

看看NINCOMPOOP的答案。 「但是,逃跑只適用於彈簧標籤。」 – Alex78191

+0

它不適用於SpEL語法'$ {variable}'。 – Alex78191

0

在JSP/Java控制在頁面級的這種行爲,您應使用此代碼:

在JSP/HTML:

<c:out value="TR tag </tr> Script Tag <script>alert("hello Rahul")</script>" escapeXml="true" /> 
+0

自定義ELResolver是最好的解決方案! – Alex78191