如何修复CAST检测出的DOM跨站脚本漏洞?求代码修改方案
解决DOM跨站脚本(XSS)漏洞的具体方案
首先,咱们得先搞明白为什么这段代码会触发XSS警报:你直接把未经过任何过滤的用户输入(sid参数)插入到HTML的value属性中,而且连属性值的双引号都没加——这就给恶意攻击者留下了可乘之机。如果有人构造一个包含脚本的sid参数(比如"><script>stealCookies()</script>),浏览器会把这段内容当作HTML/JS代码执行,直接造成DOM XSS漏洞。
核心解决思路
对用户输入进行HTML属性转义,把特殊字符转换成对应的HTML实体,让浏览器把这些内容当作普通文本而非可执行代码处理。下面给你两种可靠的修改方式:
方式一:使用JSTL的fn:escapeXml(推荐)
这是最简洁且经过测试的标准方案,前提是你的项目已经引入了JSTL标签库。
- 先在页面顶部引入JSTL函数标签库:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
- 修改原来的
input代码行:
原来的代码(注意缺少双引号,这本身就是风险):
<input type="hidden" name="sid" value=<%=request.getParameter("sid")%>>
修改后(加上双引号并转义):
<input type="hidden" name="sid" value="${fn:escapeXml(param.sid)}">
fn:escapeXml会自动把"、&、<、>等特殊字符转换成对应的HTML实体,彻底阻断脚本注入的可能。
方式二:手动实现HTML属性转义函数
如果你的项目没法用JSTL,可以自己写一个工具函数来处理转义:
- 在你的Java工具类(比如
XssUtils.java)中添加转义方法:
public class XssUtils { public static String escapeHtmlAttribute(String input) { if (input == null) { return ""; // 处理null值,避免空指针 } StringBuilder escaped = new StringBuilder(); for (char c : input.toCharArray()) { switch (c) { case '"': escaped.append("""); break; case '&': escaped.append("&"); break; case '<': escaped.append("<"); break; case '>': escaped.append(">"); break; case '\'': escaped.append("'"); break; default: escaped.append(c); break; } } return escaped.toString(); } }
- 在JSP中调用这个工具函数:
<input type="hidden" name="sid" value="<%= XssUtils.escapeHtmlAttribute(request.getParameter("sid")) %>">
关键注意事项
- 一定要给
value属性加上双引号!没有引号的话,即使转义了也可能存在其他注入风险。 - 不要只转义双引号,必须覆盖所有HTML属性中的特殊字符(
&、<、>、'、"),否则还是会有漏洞。 - 优先使用标准库(比如JSTL)而不是自己写的函数,因为标准库经过了更全面的测试,不容易遗漏边缘情况。
这样修改后,再用CAST工具检测应该就不会报XSS漏洞了。
内容的提问来源于stack exchange,提问作者user3766619
相关产品推荐
相关产品推荐

