黑客通过CSRF攻击,让我这个月吃土了
2024-06-05 加入收藏
欢迎访问Python3分钟系列。花3分钟时间,学习或温习一个Python知识点。今天是第230。
早些年老有一些钓鱼邮件来“钓”我,然而我确实也中过一次招。那就是...
什么是CSRF?
CSRF是跨站请求伪造(Cross-Site Request Forgery
)的缩写,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
很多小伙伴很容易将CSRF与XSS(
Cross Site Scripting
) 混淆,XSS利用的是用户对指定网站的信任,而CSRF利用的是网站对用户网页浏览器的信任。(面试题)
CSRF攻击利用的是冲着浏览器分不清发起请求是不是真正的用户本人。 Web端的简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
一次CSRF的攻击流程
我登录某个购物网站(例如:
shop.com
),并保留了用户凭证(Cookie);攻击者通过某种手段诱骗访问了一个模仿
shop.com
伪造的网站(例如:shop.vip
);shop.vip
向shop.com
发送请求;shop.com
接收到请求后,对请求进行验证,并确认是我的凭证(因为我的用户凭证对shop.com
是有效的),所以误以为是我自己发送的请求。shop.com
以我的名义执行了这个请求。攻击完成,攻击者通过这个方式轻松盗刷了我的购物余额。
如何防范CSRF攻击?
我们用Python的Web框架Django说明如何防范CSRF攻击。
在Django中,CSRF保护是通过中间件来实现的。 具体来说,django.middleware.csrf.CsrfViewMiddleware
中间件负责在请求处理之前和之后进行CSRF检查。
这个中间件的工作原理如下:
当请求到达时,
CsrfViewMiddleware
将检查请求方法是否为安全方法(GET、HEAD、OPTIONS、TRACE),如果是安全方法,则不会执行CSRF检查。如果请求方法不是安全方法,则中间件会检查请求中是否包含CSRF令牌。令牌通常作为名为
csrftoken
的Cookie发送给客户端,并作为名为csrfmiddlewaretoken
的POST参数或者HTTP头部发送回服务器。
在的HTML表单中包含 {% csrf_token %}
模板标签,例如:
<form method="post">
{% csrf_token %}
<!-- 其他表单字段 -->
<button type="submit">提交</button>
</form>
在每个表单提交或者重要请求中,包含一个随机生成的
CSRF Token
,并在后端验证该Token
的有效性。攻击者很难伪造这个Token
,因为它是随机的并且只在当前会话有效。
如果请求中缺少CSRF令牌,或者CSRF令牌与cookie中的不匹配,Django将抛出 CSRFTokenMissing
或者CSRFTokenForbidden
异常,从而拒绝请求。
最后
本文简单介绍了下CSRF攻击的攻击过程和1个防范案例,其实还存在很多对CSRF的防范措施,对这方面的有兴趣的小伙伴可以再深究学习下。
此外还希望小伙伴引以为戒,千万不要乱点一些奇怪邮件里的链接!!!!