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攻击的具体实现代码示例。根据项目的具体情况,你可能还需要调整这些策略,比如更严格的白名单设置或额外的安全措施。