Java CheckMarx-跨站点脚本攻击
我是CheckMarx和防止XSS攻击的新手。我有一个错误: 方法%>位于\app\src\web\searchresults.jsp的第1行,获取getSearchResults元素的用户输入。然后,该元素的值在代码中流动,没有经过适当的清理或验证,并最终在\app\src\web\searchresults.jsp的第1行以%>方法显示给用户。这可能会导致跨站点脚本攻击 这是它在下面的代码片段中抱怨的一行: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
<c:forEach var="combo" items="${searchForm.searchResults}">
从searchresults.jsp中截取代码(修改代码以保护无辜者)
我不确定如何修复的部分是,“searchForm.searchResults”是一个队列组合,可以引用多个对象,例如“object1”
我的想法是对物体进行清理。我这样做的方法是添加页面正在使用的所需属性(因为“object1”是大量的属性),并将其作为单个值,在构建对象时填充它们。我没有一个特定的解决方案来清理“queueCombo”在构建之后,但一般来说,保护用户输入的最佳实践是:
- 一旦从用户处接收到值(早期控件):在构建对象之前。早期进行的大多数清理旨在删除禁止的字符和控制值格式。这里的名字和姓氏不应该包含字母以外的任何字符
- 在使用变量(后期控制)之前。例如:在进行SQL查询之前进行SQL清理,或者在打印值之前进行HTML编码
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>