我是CheckMarx的新手并防止XSS攻击。我有这个错误:
方法%>在\ app \ src \ web \ searchresults.jsp的第1行获取getSearchResults元素的用户输入。然后,该元素的值在没有被正确消毒或验证的情况下流过代码,并最终以方法%>显示给用户。在\ app \ src \ web \ searchresults.jsp的第1行。这可能会导致跨站点脚本攻击。
这是它在下面的代码片段中抱怨的行:
<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”是一个可以引用多个对象的queueCombo,对于这个实例,“object1”。
我的想法是对物体进行清理。我这样做的方法是添加页面正在使用的所需属性(因为“object1”是大量的属性)并将其作为单个值放置并在构造对象时填充它们。
答案 0 :(得分:0)
在构建之后,我没有特定的解决方案来清理“queueCombo”,但通常保护用户输入的最佳做法是:
如果转换旨在以特定格式(例如HTML输出)对数据进行编码,则不应该提前对变量进行转换,因为它可能使得在其他上下文中使用对象(例如:DB查询)更难做到
我认为,关于你的代码片段,后者应该这样做。
Checkmarx在循环线上发出警报,但问题并不存在。它位于随后的value=
陈述中,应在此处进行消毒。
其他读者提示:不要忘记任何清理过程都应该在服务器端进行。如果是客户端,它主要是cosmetical。