2017-08-07 225 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=陈述中,应该在这里进行消毒。

其他读者的提示:不要忘记,任何消毒过程应作为服务器端。如果做成客户端,那大多是美观的。