Skip to content

如何防御 XSS 攻击?

跨站脚本攻击(Cross-Site Scripting, XSS)是一种常见的 Web 安全漏洞。攻击者通过注入恶意的 HTML 和脚本代码,窃取用户信息或破坏网站功能。

常见防御方法:

  1. HTML 转义:将特殊字符转换为它们对应的 HTML 实体。
  2. 输入验证和过滤:在接收用户输入时进行严格的检查,并阻止任何可疑或危险的内容。
  3. 使用安全框架和库:利用现有的安全工具来自动处理 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("&lt;");
                    break;
                case '>':
                    sb.append("&gt;");
                    break;
                case '&':
                    sb.append("&amp;");
                    break;
                case '"':
                    sb.append("&quot;");
                    break;
                case '\'':
                    sb.append("&#39;");
                    break;
                default:
                    sb.append(c);
            }
        }
        return sb.toString();
    }

    // 其他防御方法可以在这里实现,如输入过滤和验证
}

代码说明

  1. HTML 转义escapeHtml 方法将用户输入中的特殊字符(如 <, >, &, ", ')转换为对应的 HTML 实体。这样即使恶意脚本被注入,浏览器也会将其视为文本而不是可执行代码。
  2. 使用安全框架和库:虽然示例中没有直接展示,但建议在实际项目中使用经过验证的安全框架(如 Spring Security),这些框架提供了内置的 XSS 防护机制。

如何测试?

  1. 启动 Web 服务器并访问 http://localhost:8080/yourapp/xssExample
  2. 提交包含以下内容的表单:
    • <script>alert('XSS');</script>
  3. 观察输出是否为转义后的 HTML 实体。