攻防演练:Spring Boot 中的 CORS 和 CSRF,别让你的应用裸奔!

攻防演练: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 策略。你可以根据实际情况,调整allowedOriginsallowedMethodsallowedHeadersallowCredentials等参数,灵活控制跨域访问的权限。 例如,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学习资源包免费分享!

扫码领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值