Bootstrap

【SpringBoot实现xss防御】

SpringBoot实现xss防御

在Spring Boot中实现XSS防御,可以通过多种方式来确保输入的安全性和防止恶意脚本的注入。下面提供了一些具体的实现代码示例,包括输入清理、输出编码以及设置安全响应头。

1. 输入清理

创建一个简单的工具类来进行HTML转义:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document.OutputSettings;
import org.jsoup.safety.Cleaner;
import org.jsoup.safety.Whitelist;

public class XssUtil {

    private static final Whitelist USER_CONTENT = Whitelist.none()
            .addTags("a", "p", "img") // 允许的标签
            .addAttributes("a", "href", "title")
            .addAttributes("img", "src", "alt");

    public static String cleanXSS(String value) {
        Cleaner cleaner = new Cleaner(USER_CONTENT);
        OutputSettings outputSettings = new OutputSettings();
        outputSettings.prettyPrint(false); // 禁止格式化输出
        return Jsoup.clean(cleaner.clean(Jsoup.parseBodyFragment(value)).html(), outputSettings);
    }
}

在接收用户输入的地方使用这个工具类进行清理:

@PostMapping("/submit")
public ResponseEntity<?> submitForm(@RequestParam String userInput) {
    String sanitizedInput = XssUtil.cleanXSS(userInput);
    // 继续处理sanitizedInput...
    return ResponseEntity.ok().build();
}

2. 输出编码

如果你使用的是Thymeleaf模板引擎,默认情况下会自动对模型属性进行HTML转义。如果需要手动进行转义,可以这样做:

<p th:text="${text}">default text</p>

这里th:text指令会自动将${text}变量中的特殊字符转义为HTML实体。

对于其他模板引擎或直接返回字符串到前端的情况,可以使用Spring提供的HtmlUtils.htmlEscape()方法:

import org.springframework.web.util.HtmlUtils;

@ResponseBody
@GetMapping("/unsafe")
public String unsafe() {
    String input = "<script>alert('xss');</script>";
    return HtmlUtils.htmlEscape(input);
}

3. 设置安全响应头

可以通过添加一个过滤器来设置HTTP响应头,如Content Security Policy和X-XSS-Protection:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class SecurityHeaderFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Content-Security-Policy", "script-src 'self'");
        httpResponse.setHeader("X-XSS-Protection", "1; mode=block");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {}
}

以上就是一些在Spring Boot中防御XSS攻击的具体实现代码示例。根据项目的具体情况,你可能还需要调整这些策略,比如更严格的白名单设置或额外的安全措施。

;