springboot防止XSS攻击,拦截HTML代码注入

作者:zeke | 时间:Dec 11, 2024 3:30:17 PM | 访问量:5

<p>在<strong>SpringBoot</strong>的&nbsp;<strong>Spring Security</strong>&nbsp;中配置&nbsp;<strong>XSS(跨站脚本攻击)</strong>&nbsp;防护,主要依赖于几个方面的配置来确保输入的安全性和输出的防护。以下是一些常见的做法来配置 Spring Security 以防止 XSS 攻击。</p><p><br></p><h3>1. 启用 XSS Protection Header (<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">X-XSS-Protection</code>)</h3><p>Spring Security 提供了一个设置&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">X-XSS-Protection</code>&nbsp;响应头的方法,这个 HTTP 头由现代浏览器支持,可以启用浏览器的 XSS 保护。</p><p><br></p><pre class="ql-syntax" spellcheck="false">import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .headers() .xssProtection() .block(true) // 启用 XSS 保护并启用阻止策略 .and() .contentSecurityPolicy("default-src 'self'; script-src 'self'; object-src 'none';"); } } </pre><ul><li><code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">xssProtection().block(true)</code>:启用浏览器的 XSS 保护并启用阻止恶意脚本的执行。</li><li><code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">contentSecurityPolicy()</code>:设置 Content Security Policy (CSP) 头,以限制哪些源可以加载 JavaScript 脚本,进一步降低 XSS 风险。</li></ul><h3>2. 启用 Content Security Policy (CSP)</h3><p>CSP 是一种防止 XSS 的强大机制,它限制了允许从哪些来源加载资源(如 JavaScript、CSS、图片等)。通过配置 CSP,您可以阻止页面执行非信任的脚本。</p><p><br></p><p>在 Spring Security 中配置 CSP:</p><p><br></p><pre class="ql-syntax" spellcheck="false">@Override protected void configure(HttpSecurity http) throws Exception { http .headers() .contentSecurityPolicy("default-src 'self'; script-src 'self'; object-src 'none';"); } </pre><p>这会让浏览器只允许从同源加载资源(<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">'self'</code>),并且不允许加载任何对象(<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">object-src 'none'</code>)。这对于减少 XSS 攻击非常有效。</p><p><br></p><h3>3. 使用 Spring Security 过滤器进行 XSS 防护</h3><p>Spring Security 过滤器链本身并不会对用户输入进行 XSS 过滤。您可以结合&nbsp;<strong>Spring Security</strong>&nbsp;和&nbsp;<strong>输入验证</strong>&nbsp;来增强 XSS 防护。</p><p><br></p><ul><li><strong>防止 JavaScript 代码注入</strong>:可以在请求到达控制器之前,对用户输入的数据进行过滤(例如使用 OWASP Java HTML Sanitizer 或 Jsoup 库来清理输入中的恶意 HTML 和 JavaScript)。</li></ul><p><br></p><p>在 Spring Boot 控制器中,可以手动处理用户输入:</p><p><br></p><pre class="ql-syntax" spellcheck="false">import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; @RestController public class UserController { @PostMapping("/submit") public String submit(@RequestParam String userInput) { // 清理输入中的潜在恶意 HTML 和 JavaScript String safeInput = Jsoup.clean(userInput, Whitelist.basic()); // 进一步处理安全的输入 return "Processed: " + safeInput; } } </pre><p>在这个例子中,<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">Jsoup.clean</code>&nbsp;会清理 HTML 内容,只保留白名单允许的标签。<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">Whitelist.basic()</code>&nbsp;是一个基本的白名单,只允许非常基础的 HTML 标签,如&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">&lt;b&gt;</code>,&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">&lt;i&gt;</code>&nbsp;等。</p><p><br></p><h3>4. 配置 HTTP 安全头防止点击劫持和 XSS</h3><p>您可以配置一些 HTTP 安全头,进一步增强应用的安全性。这些头会对浏览器执行额外的安全检查。</p><p><br></p><pre class="ql-syntax" spellcheck="false">@Override protected void configure(HttpSecurity http) throws Exception { http .headers() .xssProtection() .block(true) .and() .contentSecurityPolicy("default-src 'self'; script-src 'self'; object-src 'none';") .and() .httpStrictTransportSecurity() .includeSubDomains(true) .maxAgeInSeconds(31536000) // 强制使用 HTTPS .and() .frameOptions() .deny(); // 防止点击劫持攻击 } </pre><ul><li><code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">frameOptions().deny()</code>:此配置阻止页面在&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">&lt;iframe&gt;</code>&nbsp;中嵌入,防止点击劫持攻击。</li><li><code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">httpStrictTransportSecurity().includeSubDomains(true).maxAgeInSeconds(31536000)</code>:启用 HTTP Strict Transport Security (HSTS),强制客户端通过 HTTPS 访问。</li></ul><h3>5. 使用&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">@PreAuthorize</code>&nbsp;或&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">@Secured</code>&nbsp;限制访问</h3><p>通过控制访问权限,确保 XSS 攻击者无法访问不该访问的资源。虽然这对 XSS 本身防护作用不大,但它可以帮助限制恶意用户的操作范围。</p><p><br></p><pre class="ql-syntax" spellcheck="false">import org.springframework.security.access.prepost.PreAuthorize; @RestController public class AdminController { @PreAuthorize("hasRole('ADMIN')") @GetMapping("/admin/dashboard") public String getDashboard() { return "Admin Dashboard"; } } </pre><h3>6. 使用 Spring Boot 与 XSS 防护库</h3><p>Spring Boot 并没有内建的专门用于防护 XSS 的机制,但你可以集成如&nbsp;<strong>OWASP Java HTML Sanitizer</strong>&nbsp;或&nbsp;<strong>JSoup</strong>&nbsp;来清理不安全的输入。</p><p><br></p><h4>OWASP Java HTML Sanitizer</h4><p>OWASP 提供了一个专门用来清理恶意 HTML 的库,叫做&nbsp;<strong>HTML Sanitizer</strong>。你可以将其集成到 Spring Boot 中,用于对用户输入进行处理。</p><p><br></p><pre class="ql-syntax" spellcheck="false">import org.owasp.html.Sanitizers; import org.owasp.html.HtmlPolicyBuilder; public String sanitizeInput(String input) { // 使用 OWASP HTML Sanitizer 清理输入 return new HtmlPolicyBuilder() .allowElements("a", "b", "i", "u") // 允许标签 .toFactory() .sanitize(input); // 清理输入 } </pre><h4>Jsoup</h4><p>Jsoup 是另一个广泛使用的 HTML 解析库,可以用来清理用户输入中的 HTML 和 JavaScript。</p><p><br></p><pre class="ql-syntax" spellcheck="false">import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; public String sanitizeInput(String input) { // 使用 Jsoup 清理输入 return Jsoup.clean(input, Whitelist.basic()); // 仅保留基本标签 } </pre><h3>总结</h3><p>通过结合使用&nbsp;<strong>Spring Security</strong>&nbsp;和一些额外的防护措施,你可以有效地减少 XSS 攻击的风险:</p><p><br></p><ol><li>配置&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">X-XSS-Protection</code>&nbsp;和&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">Content-Security-Policy</code>&nbsp;头,帮助浏览器阻止 XSS。</li><li>对所有用户输入进行清理(如使用&nbsp;<strong>Jsoup</strong>&nbsp;或&nbsp;<strong>OWASP Java HTML Sanitizer</strong>)。</li><li>使用&nbsp;<strong>Spring Security</strong>&nbsp;提供的安全头(如&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">X-Frame-Options</code>,&nbsp;<code style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);">Strict-Transport-Security</code>)增强应用的安全性。</li><li>使用 HTTP 安全头和 CSP 限制加载脚本的来源,进一步强化 XSS 防护。</li></ol><p>通过这些措施,你可以大大提高 Spring Boot 应用的安全性,防止 XSS 攻击。</p>