当我对我的项目JSP页面执行强化扫描时,Fortify抱怨更多XSS问题来修复页面。它抱怨大多数地方,例如:<c:out>
语句。我使用<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
尝试使用${fn:escapeXml(path)}
中的函数escapeXml,但这是按原样打印整个文本。
实际上我的JSP中的代码如下所示。我想修复<C:out value="${cdt}"/>
代码的XSS漏洞。
<c:set var="checked">
checked="checked"
</c:set>
<c:set var="cdt" value="" />
<c:set var="dbt" value="" />
<c:choose>
<c:when test="${casesForm.institutionRepresents == 'C'}">
<c:set var="cdt" value="${checked}"/>
</c:when>
<c:when test="${casesForm.institutionRepresents == 'D'}">
<c:set var="dbt" value="${checked}"/>
</c:when>
</c:choose>
<div class="field LINK_show">
<label><bean:message key="label.institutions" /></label>
<div style="display:inline;padding-left:10px">
<input type="radio" name="institutionRepresents" value="A" <c:out value="${cdt}" />><bean:message key="label.credit" />
<input type="radio" name="institutionRepresents" value="I" <c:out value="${dbt}" />><bean:message key="label.debit" />
</div>
</div>
有没有办法修复<c:out>
代码中的XSS漏洞?
答案 0 :(得分:3)
<c:out>
已经执行了html转义,但这通常不适合输出属性。如果用户可以控制cdt
,则可以修改属性名称或值,或添加额外属性。像空格这样的字符现在变成了元字符。
你使用它的方式是可以的,因为cdt
的值不能由用户直接操作,而是从安全常量设置。它只能是checked="checked"
或空的。您可以为该值禁用转义,因为您希望将引号直接写为html。
答案 1 :(得分:0)
查看有关<c:out>
http://tech.finn.no/2011/04/08/xss-protection-whos-responsibility/
此外,这是一个相关的问题,应该有一个很好的答案