Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第十一章:django安全 > 11.2节:CSRF防护

11.2节:CSRF防护

薯条老师 2020-10-09 11:08:16 234464 0

编辑 收藏

系统地讲解Django开发的基础知识, 高阶知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-django从入门到精通》。

11.2.1 CSRF简介

CSRF的全称为"Cross-site request forgery", 其中文释义为跨站请求伪造。与XSS攻击不同的是,CSRF不会直接窃取用户信息,而是利用已通过认证的用户,诱使其点击其它站点页面中的链接,从而发起一个合法的攻击请求。

发起CSRF攻击有一个前提条件,就是用户已经通过登录认证,并且在会话未过期前,点击其它站点中的恶意链接,这样攻击者才能利用用户已认证的信息来发起攻击。

11.2.2 CSRF的攻击过程

现在通过一个简单的例子,来理解CSRF的攻击过程。假设国外某数字货币站点为A,带有恶意链接的站点为B:

(1) 用户在站点A的登录页面输入用户名和密码,用户通过认证以后,服务器创建了一个cookie对象对会话进行管理。

(2) 浏览器将服务器响应的cookie写入到本地文件中。在会话有效期内,用户可以在站点A执行数字货币的转账,提现等操作。

(3) 在站点A的会话有效期内,用户访问了站点B,并点击了站点B中的一个不可描述的图片。此时的图片链接中包含有恶意代码,恶意代码会向站点A发起一个转账请求,将用户的数字货币转账到攻击者账户中。

(4) 由于还在会话有效期内,浏览器会将cookie信息携带在请求参数中,然后向站点A的服务器发起转账请求。服务端对cookie校验通过以后执行了来自站点B的转账操作。

以上就是CSRF的攻击过程,在这一过程中,攻击者利用已通过认证的用户,来发起一个合法的请求,就将用户的数字货币转到了自己的账户中。

11.2.3 防御CSRF攻击

防范CSRF攻击的方法主要有两种:

(1) 检查http协议中的Referer字段

HTTP协议中的Referer字段会标明发起请求的来源。

以上文中的数字货币转账为例,用户在站点B点击了恶意链接,那么当发起转账请求时,该请求中的Referer字段包含的会是站点B的地址。通过检查Referer字段的值,站点服务器可以识别出恶意请求。

该方法的局限性在于Referer字段的值取决于浏览器的实现,且攻击者可以伪造Referer字段。

(2) 使用校验token

CSRF攻击的本质是利用用户保存在会话中的已认证的登录信息,从而在目标网站中执行恶意攻击。基于此点, 服务端可以要求在发起请求时,用户浏览器提供一个不存在于cookie中的随机token,这样即便攻击者对请求进行了伪造,由于缺少该字段值,也会被服务器识别为恶意请求。

这种数据通常是页面表单中的一个数据项,服务器将其生成并附加在表单的隐藏域中,其内容是一个伪随机数。当用户通过表单提交请求时,这个伪随机数也一并携带在请求参数中提交给服务器。

django在模板中提供了该类方法,通过在form表单中加上一行{% csrf_token %}的代码,就可以在表单中生成一个随机token, 以防范CSRF攻击:

<form>
{% csrf_token %}
</form>

django在进行模板渲染时,如遇到模板标签{% csrf_token %},会在页面中生成一段html的隐藏域代码。隐藏域代码如下所示:

<input type='hidden' name='csrfmiddlewaretoken' value='nWj2B3Md9Z134NmX1MXDolPmh3bR2G98' />

input标签中的value值,即为django生成的一个随机token,通过该token值可以对浏览器的访问请求进行校验。django服务器在校验过程中,如果发现token的值为空或者错误,会拒绝这个可疑请求。

关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。

小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。


欢迎 发表评论: