在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本。这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的。攻击者在使用攻击后一般能够:
如果被攻击的用户在应用程序中具有更高的权限。攻击者可以完全控制应用程序,并破坏所有用户及其数据。
常见的 XSS 攻击主要有三种:存储型 XSS 攻击,反射型 XSS 攻击和 DOM-based 型 XSS 攻击。
下面是一个简单的POST方法,模拟创建 Book 并将其保存到数据库中。
@RestController @RequestMapping("/books") public class BookController { @Autowired IBookService bookService; @PostMapping public void saveBook(@RequestBody Book book) { bookService.save(book); } }
我们可以在保存的时候,对 type 值做一段 js 注入,来模拟存储型 XSS 攻击。
现在我们来请求一下,这里的 JavaScript 只会 alert 一个语句,但这种漏洞就有可能被别人利用来注入一些其他的恶意代码:
一些浏览器内置了对过滤反射型 XSS 攻击的支持。在一定程度上有助于 XSS 保护。 我们需要在 HTTP 响应头添加如下内容确保已启用该功能,并指示浏览器在检测到 XSS 攻击时进行阻止。
X-XSS-Protection: 1; mode=block
如果你的项目引入了 Spring Security ,那么默认情况下就会自动添加此标头。
兼容 内容安全策略 浏览器将仅执行从我们的“允许”列出的域接收的源文件中加载的脚本,而忽略所有其他脚本,例如内联脚本。我们可以添加以下标头来启用浏览器的内容安全策略功能。
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf().disable()//为了简化示例并更清楚地说明XSS注入,此处禁用了CSRF保护。真实情况请勿使用。 .authorizeRequests().anyRequest().authenticated() .and().httpBasic() .and() .headers().contentSecurityPolicy("script-src 'self'"); } }
以下是所有支持 CSP 的浏览器:
我们知道该字段仅需要中文英文和数字字符,因此我们可以使用 Spring 的 Validator 在字段中添加@Pattern注解。
@NotNull @Pattern(message="种类只能支持中文英文数字", regexp = "[\u4e00-\u9fa5_a-zA-Z0-9]+") private String type;
然后将 @Valid 添加到接收 Book 的方法中,这样当发生请求时就会自动验证:
@PostMapping public void saveBook(@RequestBody @Valid Book book) { bookService.save(book); }
现在主流的几种前端框架,像 Angular 、 React 、 Vue 也可以避免传统开发可能带来的问题:
防止 XSS 漏洞主要涉及以下措施的组合:
到此这篇关于SpringBoot如何防止XSS注入攻击的文章就介绍到这了,更多相关SpringBoot防止XSS注入攻击内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!