Java CheckMarx-跨站点脚本攻击

Java CheckMarx-跨站点脚本攻击,java,jsp,xss,Java,Jsp,Xss,我是CheckMarx和防止XSS攻击的新手。我有一个错误: 方法%>位于\app\src\web\searchresults.jsp的第1行,获取getSearchResults元素的用户输入。然后,该元素的值在代码中流动,没有经过适当的清理或验证,并最终在\app\src\web\searchresults.jsp的第1行以%>方法显示给用户。这可能会导致跨站点脚本攻击 这是它在下面的代码片段中抱怨的一行: <c:forEach var="combo" items="${searchF

我是CheckMarx和防止XSS攻击的新手。我有一个错误:

方法%>位于\app\src\web\searchresults.jsp的第1行,获取getSearchResults元素的用户输入。然后,该元素的值在代码中流动,没有经过适当的清理或验证,并最终在\app\src\web\searchresults.jsp的第1行以%>方法显示给用户。这可能会导致跨站点脚本攻击

这是它在下面的代码片段中抱怨的一行:

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

从searchresults.jsp中截取代码(修改代码以保护无辜者)


我不确定如何修复的部分是,“searchForm.searchResults”是一个队列组合,可以引用多个对象,例如“object1”


我的想法是对物体进行清理。我这样做的方法是添加页面正在使用的所需属性(因为“object1”是大量的属性),并将其作为单个值,在构建对象时填充它们。

我没有一个特定的解决方案来清理“queueCombo”在构建之后,但一般来说,保护用户输入的最佳实践是:

  • 一旦从用户处接收到值(早期控件):在构建对象之前。早期进行的大多数清理旨在删除禁止的字符和控制值格式。这里的名字和姓氏不应该包含字母以外的任何字符
如果转换旨在以特定格式(例如HTML输出)对数据进行编码,则不应提前执行变量转换,因为这可能会使对象在其他上下文(例如:DB查询)中的使用更加困难

  • 在使用变量(后期控制)之前。例如:在进行SQL查询之前进行SQL清理,或者在打印值之前进行HTML编码
我认为,关于您的代码片段,后者应该可以

Checkmarx正在循环线上发出警报,但问题并不存在。它位于后面的
value=
语句中,应该在这里进行消毒

给其他读者的提示:不要忘记任何消毒过程都应该在服务器端进行。如果是客户端制作,则主要是美容

<% 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>