你的钱为什么被转走,这篇文章告诉你答案(CSRF详解)

本文深入解析了CSRF(跨站请求伪造)攻击原理,通过实例展示了如何利用此漏洞非法转账,同时提供了三种防御策略,包括验证码、RefererCheck和动态Token。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段时间很多文章标题都是面试官,所以跟个风,这篇文章也以面试官开头,主要内容是关于CSRF。全称叫做Cross-site request forgery,中文全称叫做跨站请求伪造。

一、CSRF是什么?

刚刚已经说了,全称叫做夸张请求伪造,很明显就是和安全有关的一个知识点,意思是攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。

举个例子来解释,你去某网买东西,输入了用户名密码,攻击者在另外一个页面重新使用了你的用户名密码。比如发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账。

所以说危害那是相当严重,我们使用一张图来表示一下这个过程吧。

在这里插入图片描述
至于能不能经得起诱惑,就看个人了。有时候我们点击了某一个链接但是没有执行任何操作,银行卡的钱却不见了,你知道这是为什么吗?我们可以模拟一下这个过程。

二、你的钱为什么会不见了

其实这个步骤和刚刚那个图是一样的。现在有张三和李四进行转账。

1、张三给李四100块,执行的操作是:

xxx/transfer.php?from=张三&money=100&to=李四

**注意此时的张三没有把页面关闭掉。**这里的前缀我没有写,因为文章审核通过不了。

2、黑客想把钱转给自己,执行的操作是:

xxx/transfer.php?from=张三&money=100&to=黑客

很明显会失败,这是因为张三在登录系统的时候会通过cookie,把自己的session传递给后台服务器。此时系统检查当前的session中的身份,发现不正确就拒绝了。

3、黑客继续想办法,使用不良网站诱导:

网站的连接很有颜色感,让张三欲罢不能,于是点击了诱导链接A。此时返回给黑客的信息就是:

<html>
	<body>
		<form method="get" action="xxx/java">  
			<input type="hidden" name="from" value="张三">   
			<input type="hidden" name="money" value="100">  
			<input type="hidden" name="to" value="黑客">   
			<input type="button" οnclick="submit()" value="来呀,快活呀">
		</form>
	</body>
</html>

如果此时张三刚刚给李四转完钱,并且页面还没关闭,就点击了这个链接,那么就会执行上面的操作。这是因为此时的黑客身份就是张三的信息,银行不知道因为是张三,于是接受了请求。

三、如何防范

1、验证码

这个道理很简单,也是目前使用最广泛的一种方式。验证码则强制用户必须与应用进行交互,才能完成最终请求。但该方式用户体验较差;

2、Referer Check防盗链

可以检测请求是否来自合法的源,如果请求不是来自合法源,则很可能发生了CSRF攻击,但服务器并不能在任何时候都能获取到Referer;

3、Token

使用动态的Token。使用真随机数或者经过密钥加密的字符串作为token值,使用方式可参考重放攻击防御中的token,该防御方式需要注意token的完全随机和有效期,一个经常无规则变动的token值往往是无法破解的。

具体的更加详细的就不说了。这个是面试中很常问的一个面试点。

在这里插入图片描述

<think>好的,我现在需要帮助用户了解CSRF攻击的原理和防护措施。首先,我需要回顾一下CSRF的基本概念。根据引用[3],CSRF是跨站请求伪造,攻击者伪造受信任用户的请求来利用网站。这和XSS不同,XSS是利用站点内的信任用户,而CSRF则是伪装成用户发送请求。 接下来,我需要详细解释CSRF的工作原理。攻击者是如何诱使用户在已认证的情况下执行恶意请求的呢?比如,用户登录了银行网站,然后访问了恶意网站,这个恶意网站里有一个表单,提交到银行网站的转账接口。因为用户的浏览器会自动携带cookie,服务器就会认为是用户自己的操作。这就是CSRF的攻击过程,引用[1]提到攻击者伪造请求,利用cookie通过验证。 然后,防御措施部分。用户可能想知道有哪些方法可以防止这种攻击。根据引用[1],使用token是一种方法,将随机生成的token放在请求参数中,而不是cookie里,服务器验证这个token。另外,引用[2]提到SameSite Cookie属性,可以设置Strict或Lax来限制cookie的发送,防止跨站请求携带cookie。 我需要确保回答结构清晰,分点说明原理和防御措施。可能还需要比较不同防御方法的优缺点,比如token的使用和SameSite属性的区别。同时,要检查是否有其他防御方法,比如验证HTTP Referer头部,或者要求用户进行二次验证。 用户的问题中还提到要生成相关问题,我需要考虑用户可能还想了解哪些内容。例如,CSRF和XSS的区别,或者具体的实现步骤。另外,引用中的信息需要正确标注,比如在提到SameSite时引用[2],提到token时引用[1]。 最后,要确保回答符合用户的要求,使用中文,LaTeX格式正确,没有使用任何markdown,代码块用正确的格式。同时,生成的相关问题要贴近主题,帮助用户深入理解。</think>### CSRF攻击原理及防御措施分步解析 #### 一、攻击原理(3层递进) 1. **身份验证依赖** 网站使用Cookie/Session机制验证用户身份,浏览器会自动携带当前域的有效Cookie[^1][^3] 2. **请求伪造过程** - 用户登录银行网站(假设域A)后未登出 - 访问恶意网站(域B)包含精心构造的请求: ```html <img src="https://domainA/transfer?to=hacker&amount=1000000"> ``` - 浏览器自动携带domainA的Cookie发送请求 3. **攻击达成条件** - 请求参数可预测(无需验证码/二次确认) - 用户保持登录状态 - 请求自动发送(通过`<img>`/`<form>`等标签触发) #### 二、防御措施(4层防御体系) 1. **SameSite Cookie属性** 设置Cookie时添加`SameSite=Lax/Strict`属性: ```http Set-Cookie: sessionid=xxxx; SameSite=Lax ``` - Strict:完全禁止第三方Cookie - Lax:允许GET请求携带Cookie(Chrome默认值)[^2] 2. **CSRF Token验证** 生成随机token并同时存储在服务端和客户端: ```python # Django示例 from django.middleware.csrf import get_token def transfer_view(request): csrf_token = get_token(request) # 生成token return render(request, 'form.html', {'csrf_token': csrf_token}) ``` 表单提交时验证: ```html <form> <input type="hidden" name="csrf_token" value="{{ csrf_token }}"> </form> ``` 服务端校验逻辑: $$ \text{valid} = \begin{cases} \text{True} & \text{if } \text{req\_token} = \text{server\_token} \\ \text{False} & \text{otherwise} \end{cases} $$[^1] 3. **关键操作二次验证** - 密码/短信验证码确认 - 生物特征识别(指纹/面部识别) 4. **防御效果对比表** | 方法 | 防御强度 | 实现复杂度 | 用户体验影响 | |-------------------|----------|------------|--------------| | SameSite Cookie | ★★★★ | ★★ | 低 | | CSRF Token | ★★★★★ | ★★★★ | 中 | | 二次验证 | ★★★★★ | ★★★ | 高 | #### 三、进阶防护策略 1. **请求头校验** ```python # 检查Origin/Referer头 def check_referer(request): allowed_domains = ['trusted.com', 'api.trusted.com'] referer = request.headers.get('Referer') return any(d in referer for d in allowed_domains) ``` 2. **关键操作日志审计** ```sql CREATE TABLE security_log ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, action_type VARCHAR(50), timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, ip_address VARCHAR(45) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值