攻防演练:Spring Boot 中的 CORS 和 CSRF,别让你的应用裸奔!
1. CORS:跨域资源共享?跨“站”打击才够劲!
啥是 CORS?
CORS(Cross-Origin Resource Sharing),江湖人称“跨域资源共享”,听起来高大上,其实就是浏览器为了安全起见,搞的一个“跨站打击”机制。它就像一个门卫,专门盘查那些想从不同“领地”(域名)来访问你家(服务器)资源的“不速之客”。 它的存在,主要是为了防止你的网页随随便便就被其他网站“白嫖”数据,特别是那些涉及到用户隐私的 API 接口,必须得安排得明明白白。
CORS 工作原理:这波啊,是“预判”!
- 当你的前端小弟(比如在
http://localhost:3000
上)想去撩拨后端的 Spring Boot 大佬(运行在http://localhost:8080
上)时,浏览器老大哥会先派出一个“先遣队”—— 预检请求(OPTIONS
请求)。 - 这个“先遣队”的任务是打探敌情,问问 Spring Boot 大佬:“大哥,我这边想跨域访问一下,您看行不行啊?”
- Spring Boot 大佬会返回一堆“通关文牒”(标头),告诉浏览器老大哥:“没问题,允许他过来!”或者:“滚犊子,不许跨域!”
Spring Boot 配置 CORS:全球通or定点爆破?
CORS 配置可以在全局范围内进行,也可以针对特定的“据点”(控制器)进行设置。
示例 — Spring Boot 全局 CORS 配置:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许所有路径的 CORS,简单粗暴! .allowedOrigins("http://localhost:3000") // 只允许这个“据点”访问,精准打击! .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法,兵器库随便挑! .allowedHeaders("*") // 允许携带的“信物”(请求头),畅通无阻! .allowCredentials(true); // 允许携带“秘密令牌”(cookies),身份验证! } }
这段代码就像是给你的 Spring Boot 应用设置了一个全局的 CORS 策略。你可以根据实际情况,调整allowedOrigins
、allowedMethods
、allowedHeaders
和allowCredentials
等参数,灵活控制跨域访问的权限。 例如,allowedOrigins
可以设置为具体的域名,也可以设置为"*"
允许所有域名访问(生产环境慎用!)。allowedMethods
可以设置为允许的 HTTP 方法,例如 GET、POST、PUT、DELETE 等。allowedHeaders
可以设置为允许的请求头,"*"
表示允许所有请求头。allowCredentials
用于控制是否允许携带 Cookie 等凭证信息。
2. CSRF:跨站请求伪造?“李代桃僵”的阴谋!
啥是 CSRF?
CSRF(Cross-Site Request Forgery),又名“跨站请求伪造”,是一种“李代桃僵”式的攻击。 攻击者会伪装成你,偷偷摸摸地在已经认证过的网站上执行一些你并不想执行的操作(比如提交表单、转账)。 它利用的是网站对你浏览器的信任,简直是防不胜防!
CSRF 工作原理:瞒天过海,暗度陈仓!
- 假设你登录了某银行网站,攻击者会搞一个恶意页面,诱导你的浏览器在你毫不知情的情况下向银行网站发送请求。
- 这会导致一些未经授权的操作,比如把你的钱转到别人的账户,或者修改你的账户信息。想想都可怕!
- CSRF 保护机制通过要求在表单或标头中包含一个“令牌”(CSRF 令牌)来确保请求来自合法渠道,而不是被“李代桃僵”了。
Spring Boot 中的 CSRF 保护:默认开启,保驾护航!
Spring Security 默认开启了 CSRF 保护,就像给你的应用穿上了一层“金钟罩”。 启用 CSRF 保护后,每次提交表单都会包含一个由服务器验证的 CSRF 令牌,确保请求的合法性。
-
CSRF 令牌
:这玩意儿就像一个“暗号”,只有服务器和客户端知道。 每次发起请求时,客户端都需要带上这个“暗号”,服务器验证通过后才会放行。
-
这个“暗号”必须是唯一的、秘密的、不可预测的,这样才能防止攻击者伪造。
禁用 CSRF:特定场景,灵活应对!
在某些情况下,比如你正在使用无状态 API(用 JWT 令牌认证), CSRF 保护就显得有点多余了,可以考虑禁用。
示例 — Spring Boot 禁用 CSRF:
import org.springframework.context.annotation.Configuration; 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; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() // 禁用 CSRF 保护,胆大心细! .authorizeRequests() .anyRequest().authenticated(); // 确保所有请求都经过身份验证,亡羊补牢! } }
在这段代码中,csrf().disable()
就是禁用 CSRF 保护的关键。但是,请务必确保你的 API 使用了其他的身份验证机制(例如 JWT),否则你的应用可能会暴露在 CSRF 攻击的风险之下。 禁用 CSRF 保护通常适用于无状态的 API,因为 CSRF 保护依赖于 Session,而无状态 API 不使用 Session。
一句话总结
-
CORS
:浏览器端的安全策略,用于限制跨域请求。配置灵活,可以全局配置,也可以针对特定接口配置。
-
CSRF
:防止跨站请求伪造的安全机制,Spring Security 默认开启。对于无状态 API,可以考虑禁用。
记住,网络安全无小事,CORS 和 CSRF 都是保护你的 Spring Boot 应用的重要防线。 搞懂它们,用好它们,才能让你的应用在互联网的“枪林弹雨”中屹立不倒!
最后
从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗透测试工具镜像文件大全
⑦ 2023密码学/隐身术/PWN技术手册大全
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
扫码领取
