CSRF攻击

CSRF攻击是通过用户已登录的浏览器cookie来伪装请求,篡改数据。防御措施包括正确使用HTTP方法,如区分GET和POST,以及使用CSRF令牌校验。CSRF令牌是一个随机数,存储在客户端,服务器端校验时比对,防止攻击者伪造请求。此外,可结合Referer检测,但其易被篡改。将token放入cookie并设置httponly和secure属性能进一步增强安全性。

CSRF(跨站请求伪造)攻击

CSRF(Cross Site Request Forgery,跨站请求伪造)是一种近年来才逐渐被大众了解的网络攻击方式,又被称为One-Click Attack或Session Riding。
攻击原理
某用户登录了A网站,认证信息保存在cookie中。当用户访问攻击者创建的B网站时,攻击者通过在B网站发送一个伪造的请求提交到A网站服务器上,让A网站服务器误以为请求来自于自己的网站,于是执行响应的操作,该用户的信息边遭到了篡改.
总结起来就是,攻击者利用用户在浏览器中保存的认证信息,向对应的站点发送伪造请求。用户的认证是通过保存在cookie中的数据实现,在发送请求是,只要浏览器中保存了对应的cookie,服务器端就会认为用户已经处于登录状态,而攻击者正是利用了这一机制。

防范措施

1、正确使用HTTP方法
防范CSRF的基础就是正确使用HTTP方法。在普通的Web程序中,一般只会用到GET和POST方法。而且目前在HTML中仅支持GET和POST方法(借助AJAX则可以使用其他方法)。在使用HTTP方法时,通常应该遵循下面 的原则:

1、 GET方法输入安全方法,不会改变资源状态,仅用于获取资源。页面中所有可以通过链接发起的请求都属于GET请求。

2、 POST方法用户创建、修改和删除资源。在HTML中使用form标签创建表单并设置提交方法为POST,在提交时会创建POST请求。

在GET请求中,查询参数用来传入过滤返回的资源,但是在某些情况下,也可以通过查询参数传递少量非敏感信息。

在删除资源时,应该将删除按钮内嵌在使用了POST方法的form元素中

2、CSRF令牌校验
当处理非GET请求时,要想避免CSRF攻击,关键在判断请求是否来自自己的网站。理论上讲,通过HTTP referrer可以判断原站点从而避免CSRF攻击,但是referer很容易被修改和伪造,所以不能作为主要的防御措施。

除了在表单中加入校验码外,一般的做法是通过在客户端页面中加入伪随机数来防御CSRF攻击,这个伪随机数通过被称为CSRF令牌(token)。

在计算机语境中,令牌(token)指用于标记、验证和传递信息的字符,通常是通过一定算法生成的随机数。

在HTML中,POST方法的请求通过表单创建。我们把在服务器端创建的伪随机数(CSRF令牌)添加到表单中的隐藏字段里和session变量(即签名cookie)中,当用户提交表单时,这个令牌会和表单数据一起提交。在服务器端处理POST请求时,会对表单中的令牌值进行验证,如果表单中的令牌值和seesion中的令牌值相同,就说明请求来自自己的网站。因为CSRF令牌在用户向包含表单的页面发起GET请求时创建,并且在一定时间内过期,一般情况下攻击者无法获取到这个令牌值,所以我们可以有效地区分出请求的来源是否安全。

对于AJAX请求,我们可以在XMLHttpRequest请求首部添加一个自定义字段X-CSRFToken来保存CSRF令牌。

如果程序存在XSS漏洞,那么攻击者可以使用javaScript窃取cookie内容,进而获取CSRF令牌。

3、检测Referer.
所谓Referer,就是在一个网络请求头中的键值对,标示着目前的请求是从哪个页面过来的。服务器通过检查Referer的值,如果判断出Referer并非本站页面,而是一个外部站点的页面,那么我们就可以判断出这个请求是非法的。与此同时,我们也就检测到了一次csrf攻击。但是,服务器有时候并不能接收Referer值,所以单纯地只通过Referer来防御是不太合理的,它因此经常用于csrf的检测。
而且referer也容易被篡改

在这里插入图片描述

CSRF令牌防范原理是什么呢?

需要看下面的知识点

关于token、cookie与session的理解

HTTP协议本身是无状态的,所以需要一个标志来对用户身份进行验证

1.token
用户进行任何操作时,都需要带上一个token

token的存在形式有很多种,header/requestbody/url 都可以

这个token只需要存在客户端,服务器在收到数据后,进行解析

token是无状态的

token是存在cookie中的

2.cookie
用户登录成功后,会在服务器存一个session,同时发送给客户端一个cookie,这个cookie里面有唯一标识该用户的sessionID

数据需要客户端和服务器同时存储

用户再进行请求操作时,需要带上cookie,在服务器进行验证

cookie是有状态的

3.session
存储在服务器端的

保存着用户信息等sessionId,和cookie搭配使用

下面来说一点,csrf的攻击是怎么样的呢,要知道攻击过程中cookie对于攻击者来说都是未知的,不可见的,攻击者能做到的仅仅是借用cookie,但cookie里面具体写了什么,有什么,攻击者是不知道的;而攻击者只是盗用了登录网站的这个cookie来伪造身份去请求,就像攻击者盗用用户的门禁卡一样,那你就好奇了,既然都进门了,那cookie也就无法起到防御的效果了呀;就算是不知道cookie里面有什么,但是攻击者尽管调用就行了,那t存储在cookie里面的token怎么样防御呢!

这就涉及到了cookie的同源策略,同源策略简单来说,就是只有相同域名的网页才能获取到该域名对应的cookie,因为同源策略的限制,当正常用户通过账号密码等方式登陆网站A后,在不注销账号或当前COOKIE失效之前,再次访问网站A时(协议、IP、端口号相同则属于同源)浏览器会自动在HTTP请求包中带上该网站用户登陆后的COOKIE信息··

你在自己的网页上 getCookie可以获取自己的cookie;所以你自己的网站可以获取自己的token,放到input中的隐藏hidden字段

而别人在其他域名无法获取你的cookie,也就无法获取你的token,所以当别人伪造请求时,token和cookie中的token是绝对不一致的;

详情参考美团的csrf攻击文章详解:https://juejin.cn/post/6844903689702866952#heading-18

重点:
为什么将token放在cookie中,因为:cookie, 如果不设置过期时间,cookie保存在内存中,生命周期随浏览器的关闭而结束,如果设置了过期时间,cookie保存在硬盘中,关闭浏览器,cookie数据直到过期时间而消失;cookie是服务器发给客户端的特殊信息,cookie是以文本的形式保存在客户端,每次请求都会带上它(cookie会存储起来,并不是每次登录都会重新生成一个、会重新调用存储的)

区别:

1.在cookie中不能跨域;有同源策略;将 Token 存储在 cookie 中,可以指定 httponly 来防止 js 被读取,也可以指定 secure 来保证 Token 只在 HTTPS 下传输

2.储存在 localStorage 中,每次调用接口时放在http请求头里面,长期有效

3.储存在 sessionStorage 中,每次调用接口时,把它当为一个字段传给后台,浏览器关闭自动清除

基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
token 完全由应用管理,所以它可以避开同源策略

CSRF(Cross-site request forgery,跨站求伪造)是一种常见的Web安全漏洞,攻击者通过伪装成用户向已认证的Web应用发送恶意求,从而执行未经授权的操作,例如更改用户密码、发起转账等。这种攻击之所以能够成功,是因为浏览器会自动在求中携带用户与目标网站的会话信息(如Cookie),而服务器端无法区分求是否由用户主动发起[^4]。 ### CSRF攻击原理 CSRF攻击的核心在于攻击者能够诱导用户访问一个恶意网站或点击一个恶意链接,该链接会向目标网站发起求。由于用户已经登录目标网站,其会话凭证(如Cookie)会自动附加到求中,服务器端误认为这是用户合法的操作求。例如,攻击者可以构造一个隐藏的表单,当用户点击某个链接或访问某个页面时,自动提交该表单至目标网站,执行如更改邮箱、转账等操作[^4]。 ### CSRF防护措施 #### 1. CSRF Token CSRF Token 是目前最成熟、最广泛使用的防护方法。其基本思想是在每次求中加入一个随机生成的令牌(Token),该令牌必须包含在求参数或求头中,服务器端会对该令牌进行验证。由于攻击者无法获取该令牌(不能通过跨域访问获取),因此无法伪造合法的求。通常的做法是: - 在登录或初始化会话时生成一个唯一的Token。 - 将Token存储在服务器端(如Session)。 - 在前端页面中将Token作为隐藏字段或求头传递。 - 服务器端接收到求后,验证Token是否匹配。 例如,在HTML表单中可以加入如下隐藏字段: ```html <input type="hidden" name="csrf_token" value="abc123xyz"> ``` 在后端验证逻辑中,可以通过拦截器或中间件进行Token校验[^3]。 #### 2. 同源检测(Origin 和 Referer 检查) 通过检查求头中的 `Origin` 或 `Referer` 字段,判断求是否来自预期的源。如果这两个字段缺失或与当前域名不匹配,则拒绝该求。这种方法适用于大多数现代浏览器,但存在一定的局限性,例如某些客户端或代理可能会省略这些字段,导致误判[^1]。 #### 3. 验证求方法一致性 只对 `POST` 求进行CSRF防护是一种语义一致性策略。因为 `GET` 求通常用于获取数据,不应产生副作用,而 `POST` 求则用于提交数据、执行操作。因此,开发者应确保所有状态更改的操作都使用 `POST` 方法,避免使用 `GET` 提交敏感操作,从而减少攻击面。 #### 4. 二次验证(用户交互确认) 对于高敏感操作(如修改密码、转账等),可以要求用户再次输入密码或点击确认按钮。这种方式虽然增加了用户体验的复杂度,但能有效防止CSRF攻击,因为攻击者无法自动完成二次验证步骤。 #### 5. SameSite Cookie 属性 现代浏览器支持 `SameSite` Cookie 属性,可以设置为 `Strict` 或 `Lax`,以限制Cookie在跨站求中的发送。设置为 `SameSite=Strict` 时,Cookie 仅在同源求中发送;设置为 `SameSite=Lax` 时,允许部分安全的跨站求(如 `GET` 求)携带Cookie。这种方法可以有效缓解CSRF攻击,但需要浏览器支持。 ### 小结 CSRF攻击利用了浏览器自动携带会话凭证的机制,攻击者通过诱导用户访问恶意链接或页面,伪造用户执行非授权操作。为了有效防御CSRF攻击,推荐使用 **CSRF Token** 机制,结合 **同源检测** 和 **求方法一致性** 等策略,确保求的来源可信且不可伪造。此外,合理使用 **SameSite Cookie 属性** 也能在现代浏览器中提供额外的防护[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值