文章目录
- XSS防范
- 使用HTML转义
- 使用Content Security Policy (CSP)
- 输入验证
- 使用安全的库和框架
- 避免直接使用用户输入构建JavaScript代码
XSS防范
使用HTML转义
在输出用户输入时,对特殊字符进行转义,防止它们被解释为HTML或JavaScript代码。
例如,使用StringEscapeUtils
:
import org.apache.commons.text.StringEscapeUtils;String userInput = request.getParameter("input");
String safeInput = StringEscapeUtils.escapeHtml4(userInput); // 转义HTML
out.println(safeInput);
举个例子,以下是漏洞代码:
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>XSS 测试</title>
</head>
<body>
<h1>在JavaScript中直接使用用户输入导致XSS</h1>
<form action="index.jsp" method="get"><label>请输入内容:</label><input type="text" name="input"><button type="submit">提交</button>
</form>
<h2>输出结果:</h2>
<p><%String userInput = request.getParameter("input");if(userInput != null){out.println("<script>var input = '" + userInput + "';</script>");}%>
</p>
</body>
</html>
代码直接将用户输入插入JavaScript中,导致XSS:
使用StringEscapeUtils进行转义可有效防止XSS:
<%@ page import="org.apache.commons.text.StringEscapeUtils" contentType="text/html; charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>XSS 测试</title>
</head>
<body>
<h1>在JavaScript中直接使用用户输入导致XSS</h1>
<form action="index.jsp" method="get"><label>请输入内容:</label><input type="text" name="input"><button type="submit">提交</button>
</form>
<h2>输出结果:</h2>
<p><%String userInput = request.getParameter("input");String safeInput = StringEscapeUtils.escapeHtml4(userInput); // 转义HTMLif(userInput != null){out.println("<script>var input = '" + safeInput + "';</script>");}%>
</p>
</body>
</html>
JSP中可以使用JSTL的<c:out>
标签实现转义:
<c:out value="${param.input}" escapeXml="true"/> <!-- 自动转义HTML -->
Thymeleaf框架能够自动转义:
<p th:text="${input}"></p> <!-- Thymeleaf默认会自动转义 -->
使用Content Security Policy (CSP)
CSP是一种浏览器安全机制,可以通过HTTP头来限制页面中可以执行的脚本来源,从而减少XSS攻击的风险。
response.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'");
输入验证
对用户输入进行严格验证,确保其符合预期的格式和类型。例如,使用正则表达式检查输入是否为合法的电子邮件地址或电话号码:
String userInput = request.getParameter("input");
if (!userInput.matches("[a-zA-Z0-9]+")) {// 输入不合法,拒绝处理
}
使用安全的库和框架
许多现代框架提供了内置的XSS防护机制。例如,Spring框架的HtmlUtils可以安全处理用户输入:
import org.springframework.web.util.HtmlUtils;String userInput = request.getParameter("input");
String safeInput = HtmlUtils.htmlEscape(userInput); // 使用Spring的HtmlUtils进行转义
out.println(safeInput);
避免直接使用用户输入构建JavaScript代码
尽量避免将用户输入直接嵌入JavaScript代码中。如果必须这样做,应进行适当的转义。
String userInput = request.getParameter("input");
String safeInput = StringEscapeUtils.escapeEcmaScript(userInput); // 转义JavaScript
out.println("<script>var input = '" + safeInput + "';</script>");