xss_0">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 {@Overridepublic 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);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
以上就是一些在Spring Boot中防御XSS攻击的具体实现代码示例。根据项目的具体情况,你可能还需要调整这些策略,比如更严格的白名单设置或额外的安全措施。