SpringBoot CORS跨域资源共享
文章目录
前言
一个健壮的系统上线时,以及后续验收过程中,通常都会做系统安全测评,这是信息系统正式上线安全运行的重要环节。我们大概率会遇到一个叫:跨域资源共享漏洞的漏洞要求整改,具体描述大概是:“经测试发现服务器存在不安全的CORS配置,存在恶意跨域请求和内部信息泄露的风险。”今天我们就来了解一下这个CROS漏洞,并记录一下在整合了springSecurity这一套安全框架下的springboot系统中如何在后端过滤器中通过正确注册WebMvcConfigurer bean来配置CORS的全局设置,实现对非白名单访问源的拦截。
一、什么是CORS?
CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。
在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一个网页请求另一个网页上的资源时,浏览器会检查请求是否符合CORS规范,以确定是否允许该请求。
CORS的工作原理是:当浏览器发送一个跨域请求时,它会附加一些额外的头部信息到请求中,这些头部信息包含了关于请求的来源和目的的信息。服务器可以检查这些头部信息并决定是否允许该请求。如果服务器允许请求,它会返回一个响应,其中包含一个名为“Access-Control-Allow-Origin”的头部信息,该信息指定了哪些源可以访问该资源。浏览器会检查返回的“Access-Control-Allow-Origin”头部信息,以确定是否允许该跨域请求。通过使用CORS,开发人员可以控制哪些外部网页可以访问他们的资源,从而提高应用程序的安全性。
二、配置CORS方法
1.nginx中配置跨域资源访问策略
nginx中配置跨域资源访问策略,在之前的博客中已经写过具体配置方法了,需要的朋友直接移步以下博客链接查看:
https://blog.youkuaiyun.com/weixin_42925623/article/details/134548502
2.springSecurity 过滤器链中配置跨域资源访问策略
在Spring框架中,我们可以在引入Spring Security依赖后,对Security的HttpSecurity进行设置,来开启CORS(跨域/源资源共享),同时能指定只被部分域/源、部分方法、部分头部信息访问资源。
(1)SecurityConfig中过滤器链的配置示例:
@Bean
@Order(3)
public SecurityFilterChain defaultFilterChain(HttpSecurity http
, IGuavaCacheService guavaCacheService
, IUsersService usersService
, ICaptchaApi captchaApi
, JwtEncoder jwtEncoder
, JwtDecoder jwtDecoder) throws Exception {
http.authorizeHttpRequests(requestMatcherRegistryCustomizer)
.csrf().disable()
//.cors().disable()//关闭cros配置
//.cors(withDefaults())//默认cros配置允许所有来源访问
.cors().and()//开启cros配置
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authenticationProvider(jwtAuthenticationProvider(jwtDecoder))
//在UsernamePasswordAuthenticationFilter前边添加自定义用户认证处理器
.addFilterBefore(new CustomUserAuthenticationFilter(authProperties.getLoginProcessingPath(), guavaCacheService.userLockService()), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new CaptAuthenticationFilter(captchaApi, authProperties.getLoginProcessingPath()), CustomUserAuthenticationFilter.