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

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

这段时间很多文章标题都是面试官,所以跟个风,这篇文章也以面试官开头,主要内容是关于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值往往是无法破解的。

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

在这里插入图片描述

### CSRF 详解 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击手段,攻击者通过诱导用户点击恶意链接或访问恶意网站,利用用户在目标网站上的身份认证信息,伪造请求执行未经授权的操作。这种攻击方式通常针对需要用户身份验证的网站功能,例如银行转账、修改密码或删除数据等操作。 ### 工作原理 CSRF 攻击的核心在于利用浏览器在发送请求时自动携带的 Cookie 信息。当用户登录某个网站后,浏览器会存储该网站的 Cookie,而 Cookie 通常包含用户的身份验证信息。攻击者通过诱导用户访问一个恶意网站或点击恶意链接,触发浏览器向目标网站发送请求。由于请求中包含了用户的 Cookie,目标网站会误认为该请求是由用户主动发起的,从而执行恶意操作 [^4]。 例如,假设用户登录了一个银行网站并保持登录状态,攻击者可以通过诱导用户访问一个包含 `<img src="https://bank.com/transfer?to=attacker&amount=1000">` 的恶意页面,从而触发一次转账请求。尽管用户并未主动点击转账按钮,但由于浏览器会自动发送包含 Cookie 的请求,转账操作可能会被成功执行 [^1]。 ### 防御方法 为了有效防御 CSRF 攻击,可以采取以下几种策略: 1. **使用 CSRF Token** 在每个敏感操作的请求中加入一个随机生成的 Token,服务器在处理请求时验证该 Token 的有效性。由于攻击者无法获取该 Token,因此无法伪造合法的请求。 2. **检查 HTTP Referer 头** 服务器可以检查请求的 `Referer` 头,确保请求来源于可信的来源。然而,这种方法并不完全可靠,因为某些浏览器或网络设置可能会隐藏或修改 `Referer` 头。 3. **使用 SameSite Cookie 属性** 设置 Cookie 的 `SameSite` 属性为 `Strict` 或 `Lax`,以防止 Cookie 在跨站请求中被发送。`SameSite=Strict` 会完全阻止跨站请求携带 Cookie,而 `SameSite=Lax` 允许某些安全的 GET 请求携带 Cookie。 4. **双因素认证(2FA)** 即使攻击者成功伪造请求,双因素认证可以提供额外的安全层,要求用户提供第二种身份验证方式(如短信验证码或一次性密码),从而降低攻击成功的可能性 [^1]。 5. **自定义 HTTP 头** 要求请求中包含特定的自定义 HTTP 头(如 `X-Requested-With`),攻击者无法通过简单的 `<img>` 或 `<form>` 标签伪造此类请求。 6. **验证码** 对于某些高风险操作(如更改密码或转账),可以要求用户输入验证码。验证码可以有效防止自动化攻击,但可能会影响用户体验。 ### 示例代码:使用 CSRF Token 进行防御 以下是一个简单的示例,展示如何在 Django 框架中使用 CSRF Token 来防御 CSRF 攻击: ```python from django.views.decorators.csrf import csrf_protect from django.http import HttpResponse @csrf_protect def transfer(request): if request.method == 'POST': # 处理转账逻辑 return HttpResponse("转账成功") else: return HttpResponse("无效请求") ``` 在上述代码中,`@csrf_protect` 装饰器确保只有包含有效 CSRF Token 的 POST 请求才能被处理。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值