系统地讲解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视频课程。