2017-08-07 85 views
0

我是CheckMarx的新手,可以防止XSS攻擊。我得到這個錯誤:CheckMarx - 跨站點腳本攻擊

Method %> at line 1 of \app\src\web\searchresults.jsp gets user input for the getSearchResults element. This element’s value then flows through the code without being properly sanitized or validated and is eventually displayed to the user in method %> at line 1 of \app\src\web\searchresults.jsp. This may enable a Cross-Site-Scripting attack.

這是它在下面的代碼剪斷抱怨行:

<c:forEach var="combo" items="${searchForm.searchResults}"> 

代碼剪斷從searchresults.jsp(修改後的代碼,以保護無辜)

<% int i = 0;%> 
<c:forEach var="combo" items="${searchForm.searchResults}"> 
    <tr <%=i++%2==0?"":"class='odd'"%>> 
    <td align="center" style="width: 40px;"><c:out value="${combo.stay.status}"/></td> 
    <c:choose> 
    <c:when test="${hasDetailAccess}"> 
    <c:url var="detailLink" value="/detail.do"> 
    <c:param name="code" value="${searchForm.code}"/> 
    <c:param name="brandCode" value="${searchForm.brandCode}"/> 
    <c:param name="smUni" value="${combo.object1.smUni}"/> 
    <c:param name="shUni" value="${combo.object1.shUni}"/> 
    <c:param name="searchType" value="${searchForm.searchType}"/> 
    </c:choose> 
    <td style="width: 80px;"><fmt:formatDate pattern="MMM dd yyyy" value="${combo.object1.dateMade.date}"/></td> 
    <td style="width: 80px;"><c:out value="${combo.object1.lastName}"/></td> 
    <td style="width: 80px;"><c:out value="${combo.object1.firstName}"/></td> 
</c:forEach> 

,我不是肯定的如何解決的部分是,「searchForm.searchResults」是可以引用多個對象,這種情況下,「object1」的queueCombo。

我的想法是對物體進行清理。我這樣做的方法是添加頁面使用的所需屬性(因爲「object1」是大量的屬性),並將其作爲單個值並在構建對象時填充它們。

回答

0

我沒有爲你消毒「queueCombo」已建成之後,一個具體的解決方案,但概括而言,確保用戶輸入的最佳做法是:

  • 只要值從用戶接收(早期控制):在構建對象之前在這裏。早期進行的大多數清理都是爲了去除禁止的字符和控制值格式。例如:在這裏,名字和姓氏不能包含任何字母以外的字符。

如果轉換旨在以特定格式(例如HTML輸出)對數據進行編碼,因爲它可以在其他上下文中使用對象(例如:DB查詢),您不應該儘早執行變量轉換。很難做到。

  • 就在使用變量(遲控制)之前。例如:在進行SQL查詢之前進行SQL清理,或在打印值之前進行HTML編碼。

我認爲,關於你的代碼片斷,後者應該這樣做。

Checkmarx在循環線上警告,但問題不在那裏。它在後面的value=陳述中,應該在這裏進行消毒。

其他讀者的提示:不要忘記,任何消毒過程應作爲服務器端。如果做成客戶端,那大多是美觀的。