Appearance
如何防御 XSS 攻击?
跨站脚本攻击(Cross-Site Scripting, XSS)是一种常见的 Web 安全漏洞。攻击者通过注入恶意的 HTML 和脚本代码,窃取用户信息或破坏网站功能。
常见防御方法:
- HTML 转义:将特殊字符转换为它们对应的 HTML 实体。
- 输入验证和过滤:在接收用户输入时进行严格的检查,并阻止任何可疑或危险的内容。
- 使用安全框架和库:利用现有的安全工具来自动处理 XSS 防护。
示例代码
以下是一个简单的 Java Servlet 示例,展示了如何防御 XSS 攻击:
java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/xssExample")
public class XSServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户输入
String userInput = request.getParameter("input");
// 方法一:HTML 转义
String escapedInput = escapeHtml(userInput);
// 方法二:使用 javax.servlet.http.HttpSession 来获取参数,虽然这不直接防御 XSS,
// 但可以结合其他方法如过滤和验证。
response.getWriter().println("User Input: " + escapedInput);
}
private String escapeHtml(String input) {
if (input == null) {
return null;
}
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
switch(c) {
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
case '&':
sb.append("&");
break;
case '"':
sb.append(""");
break;
case '\'':
sb.append("'");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
// 其他防御方法可以在这里实现,如输入过滤和验证
}
代码说明
- HTML 转义:
escapeHtml
方法将用户输入中的特殊字符(如<
,>
,&
,"
,'
)转换为对应的 HTML 实体。这样即使恶意脚本被注入,浏览器也会将其视为文本而不是可执行代码。 - 使用安全框架和库:虽然示例中没有直接展示,但建议在实际项目中使用经过验证的安全框架(如 Spring Security),这些框架提供了内置的 XSS 防护机制。
如何测试?
- 启动 Web 服务器并访问
http://localhost:8080/yourapp/xssExample
- 提交包含以下内容的表单:
<script>alert('XSS');</script>
- 观察输出是否为转义后的 HTML 实体。