CheckMarx - Cross-Site-Scripting攻击

时间:2017-08-07 17:10:22

标签: java jsp xss

我是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”是大量的属性)并将其作为单个值放置并在构造对象时填充它们。

1 个答案:

答案 0 :(得分:0)

在构建之后,我没有特定的解决方案来清理“queueCombo”,但通常保护用户输入的最佳做法是:

  • 一旦从用户收到值(早期控制):此处在构建对象之前。早期的大多数清理都打算删除禁用的字符和控制值格式。例如:这里的名字和姓氏不应包含除字母字符以外的任何内容。

如果转换旨在以特定格式(例如HTML输出)对数据进行编码,则不应该提前对变量进行转换,因为它可能使得在其他上下文中使用对象(例如:DB查询)更难做到

  • 在使用变量之前(后期控制)。例如:在进行SQL查询之前进行SQL清理,或者在打印值之前进行HTML编码。

我认为,关于你的代码片段,后者应该这样做。

Checkmarx在循环线上发出警报,但问题并不存在。它位于随后的value=陈述中,应在此处进行消毒。

其他读者提示:不要忘记任何清理过程都应该在服务器端进行。如果是客户端,它主要是cosmetical。