跨站请求伪造-CSRF防护方法

本文详细介绍了CSRF(跨站请求伪造)攻击的原理及防御方法,包括验证HTTPReferer字段、在请求地址中添加token并验证、在HTTP头中自定义属性并验证等策略,旨在帮助开发者构建更安全的Web应用。

跨站请求伪造-CSRF防护方法         

                   

 CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

1 CSRF攻击原理

CSRF攻击原理比较简单,如图1所示。其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。

        1

1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

2 CSRF漏洞防御

CSRF漏洞防御主要可以从三个层面进行,即服务端的防御、用户端的防御和安全设备的防御。

2.1      服务端的防御

2.1.1  验证HTTP Referer字段

根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。比如某银行的转账是通过用户访问http://bank.test/test?page=10&userID=101&money=10000页面完成,用户必须先登录bank.test,然后通过点击页面上的按钮来触发转账事件。当用户提交请求时,该转账请求的Referer值就会是转账按钮所在页面的URL(本例中,通常是以bank. test域名开头的地址)。而如果攻击者要对银行网站实施CSRF攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该请求的Referer是指向攻击者的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank. test开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。

2.1.2 在请求地址中添加token并验证

CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

2.1.3 在HTTP头中自定义属性并验证

自定义属性的方法也是使用token并进行验证,和前一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了前一种方法在请求中加入token的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心token会通过Referer泄露到其他网站。

### 启用和配置 CSRF 保护以防止跨站请求伪造攻击 在 Spring Boot 应用中,CSRF跨站请求伪造)攻击可以通过 Spring Security 提供的内置支持进行有效防护。Spring Security 默认启用了 CSRF 保护机制,但需要根据应用的具体需求进行适当的配置和调整。CSRF 攻击通常利用用户已认证的身份,在不知情的情况下执行恶意请求,从而导致未授权的操作[^1]。 #### 启用默认的 CSRF 保护 Spring Security 默认已经启用了 CSRF 防护,无需额外配置即可生效。在大多数情况下,开发者只需要确保没有在安全配置中显式地禁用 CSRF 保护即可。默认情况下,CSRF 令牌(CSRF Token)会被存储在会话(Session)中,并通过 Cookie(如 `XSRF-TOKEN`)发送给客户端[^5]。 #### 配置 CSRF 保护 如果需要自定义 CSRF 保护行为,可以通过在安全配置类中重写 `configure` 方法来实现。以下是一个典型的配置示例: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } } ``` 上述配置使用了 `CookieCsrfTokenRepository` 来存储 CSRF 令牌,并且允许前端通过 JavaScript 读取该 Cookie(通过设置 `withHttpOnlyFalse()`)。这种方式适用于前后端分离的应用,前端可以在每次请求时将令牌放在请求头中(如 `X-XSRF-TOKEN`)。 #### 排除特定路径的 CSRF 保护 在某些情况下,可能需要为某些路径禁用 CSRF 保护,例如对外暴露的 API 接口或第三方服务调用的端点。可以通过 `ignoringAntMatchers` 方法来排除特定路径: ```java http .csrf() .ignoringAntMatchers("/api/**", "/webhooks/**") .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() ... ``` 该配置会跳过对 `/api/**` 和 `/webhooks/**` 路径的 CSRF 检查,适用于 RESTful API 或 Webhook 场景[^5]。 #### 前端集成 CSRF 令牌 在传统的表单提交中,Spring Security 会自动将 CSRF 令牌注入到表单中作为隐藏字段。而在前后端分离的架构中,前端需要从 Cookie 中读取 `XSRF-TOKEN`,并在每次请求中将其作为 `X-XSRF-TOKEN` 请求头发送。大多数现代前端框架(如 Angular、Vue.js)已经内置了自动处理 CSRF 令牌的功能。 #### CSRF 保护的 HTTP 方法 Spring Security 的 CSRF 保护机制默认会对所有非幂等方法(如 POST、PUT、PATCH、DELETE)进行令牌验证。GET 请求通常不会修改服务器状态,因此不会受到 CSRF 保护的影响。开发者可以根据业务需求调整支持的方法类型。 #### 响应状态码 当 CSRF 令牌验证失败时,Spring Security 会返回 HTTP 状态码 `403 Forbidden`,表示请求被拒绝。可以通过自定义异常处理来返回更友好的错误信息或重定向到特定页面[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值