2013-08-04 189 views

回答

3

我只是擔心由HTML和JS注入導致的跨站點腳本問題。 CSRF似乎還沒有成爲一個問題,因爲只是提醒「你好」沒有任何你必須登錄才能做的積極副作用。

做的笨蛋方式:

<script type="text/javascript"> 
    alert('Hello, <%= request.getParameter("name") %>'); 
</script> 

這從JS注入患有因爲有一個JS字符串文字裏面沒有JS轉義:

name=');execute_arbitrary_code();' 

,也受到HTML注入,因爲封閉腳本塊可提前關閉:

name=</script><script>execute_arbitrary_code();// 

不幸的是,在JSP中沒有標準標記,它將轉義JS字符串文本中的文本(本身在HTML腳本塊中)。你可以編寫和使用自己的標籤來完成它,或者重用一個定義它的庫。例如OWASP ESAPI有:

<script type="text/javascript"> 
    alert('Hello, <esapi:encodeForJavaScript>${param.name}</esapi:encodeForJavaScript>'); 
</script> 

但是,避免編碼到JS中通常更容易,而是通過DOM推送數據。由於DOM是純HTML,因此您只需要正常標記轉義,該標記本身就具有<c:out>標記。

<input type="hidden" id="name-parameter" value="<c:out value="${param.name}"/>"/> 
<script type="text/javascript"> 
    var name = document.getElementById('name-parameter').value; 
    alert('Hello, '+name); 
</script> 

這有助於保持JS與標記和服務器端代碼分離的長期目標。 data-屬性是將數據從標記傳遞給JS的另一種好方法。