Django CSRF 简述

简介:

CSRF(Cross-site request forgery),中文名称是跨站请求伪造。什么意思呢?简单的说,就是用户在网站A登录之后,网站生成了对应的Cookie等信息,然后这个时候,用户又打开了网站B,网站B可以在提交表单的时候,指定对象的地址为网站A,这样就对网站A提出了一个请求。


为了避免这种恶意请求,一般的方法是在客户端生成一个Token,每次提交来的请求,服务器都会验证这个Token之后才会放行。Django里面,默认配置文件里面有一个中间件,可以帮我们实现这个功能。


1
2
3
4
5
6
7
8
9
MIDDLEWARE  =  [
     'django.middleware.security.SecurityMiddleware' ,
     'django.contrib.sessions.middleware.SessionMiddleware' ,
     'django.middleware.common.CommonMiddleware' ,
     'django.middleware.csrf.CsrfViewMiddleware' ,
     'django.contrib.auth.middleware.AuthenticationMiddleware' ,
     'django.contrib.messages.middleware.MessageMiddleware' ,
     'django.middleware.clickjacking.XFrameOptionsMiddleware' ,
]


在前面的例子里面,我们都是注释掉了csrf这个中间件。因为一旦使用的话,会自动在Cookie里面生成一个CSRFToken。相对应的,在模板文件里面我们也必须提供对应的csrftoken,否则提交post请求的时候,就会出现下面的错误。

wKioL1mvYvmjflaaAAAdt8L-bnk064.png-wh_50


在打开着CSRF的中间件之后,如果观察Cookie,会发现他自动生成了一个csrftoken的键值对。 



wKiom1mvYxiSRu1pAAAXExLQf9c759.png-wh_50


如何使用呢?最简单的方式就是在模板文件的form里面添加一行 {% csrf_token %},这样就行了

1
2
3
4
5
6
7
8
9
< form  action = "/login/"  method = "POST" >
         {% csrf_token %}
         < input  type = "text"  name = "user"  />
         < input  type = "text"  name = "pwd"  />
         < input  type = "checkbox"  name = "rmb"  value = "1"  /> 10秒免登录
         < input  type = "submit"  value = "提交"  />
         < input  id = "btn1"  type = "button"  value = "按钮"  />
         < input  id = "btn2"  type = "button"  value = "按钮"  />
     </ form >


除了POST提交数据,我们还可以通过AJAX来提交数据。那么在AJAX里面应该如何使用呢?有两种方式:

  1. 可以在具体的一个AJAX请求里面添加一个header,header里面的csrftoken通过cookie获取


1
2
3
4
5
6
7
8
9
10
$( '#btn1' ).click( function  () {
                 $.ajax({
                     url:  '/login/' ,
                     type: "GET" ,
                     data: { 'user' 'root' 'pwd' '123' },
                     headers: { 'X-CSRFtoken' : $.cookie( 'csrftoken' )},
                     success: function (arg){
                     }
                 })
             });


2.我们还可以针对所有的AJAX请求统一配置,这样在执行AJAX发送之前 会自动执行下面的代码

1
2
3
4
5
$.ajaxSetup({
                 beforeSend:  function (xhr,settings){
                     xhr.setRequestHeader( 'X-CSRFtoken' , $.cookie( 'csrftoken' ));
                 }
             });


除了通过中间件全局的配置CSRF,我们还可以进行局部的调整,允许或者不允许执行CSRF。


Django提供了两个装饰器函数 csrf_exempt 和csrf_protector。


我们如果关闭了全局的CSRF,但是又希望对个别函数进行保护,可以在对应的函数上面使用csrf_protector这个装饰器。(不推荐)


例如:

1
2
3
4
from  django.views.decorators.csrf  import  csrf_exempt,csrf_protect
@csrf_protect
def  index(request):
     print (request.session)


另外一个情况就是,我们打开了全局的CSRF,但是希望对个别函数不进行保护,那么使用csrf_exempt






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1963031,如需转载请自行联系原作者

目录
相关文章
|
15天前
|
存储 JavaScript 前端开发
Django的CSRF防攻击原理详解
Django的CSRF防攻击原理详解
|
29天前
|
存储 中间件 数据安全/隐私保护
Django的CSRF保护机制:保障用户数据安全
【4月更文挑战第15天】Django是一款具有内置CSRF保护的Python Web框架,通过CSRF中间件防止攻击者伪造用户请求。其机制包括:生成并自动添加到表单的CSRF令牌,服务器端的令牌验证以及每个用户会话的唯一令牌存储。为了增强防护,开发者应使用HTTPS,自定义令牌名称,限制跨域请求,并谨慎处理第三方库。Django的CSRF保护与最佳实践结合,能有效保障用户数据安全。
|
6月前
|
安全 JavaScript 前端开发
22 Django模板 - csrf
22 Django模板 - csrf
27 0
|
9月前
|
安全 中间件 数据安全/隐私保护
Django中防范CSRF跨站点请求伪造攻击
Django中防范CSRF跨站点请求伪造攻击
|
安全 前端开发 JavaScript
Django 安全之跨站点请求伪造(CSRF)保护
Django 安全之跨站点请求伪造(CSRF)保护
114 0
|
安全 前端开发 中间件
谈谈Django的CSRF插件的漏洞
谈谈Django的CSRF插件的漏洞
125 0
谈谈Django的CSRF插件的漏洞
|
前端开发 Python
Django CSRF跨站请求伪造的禁用和使用
Django CSRF跨站请求伪造的禁用和使用
|
SQL 安全 Python
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
|
JavaScript 安全 前端开发
Django 模板HTML转义和CSRF4.3
Django 模板HTML转义和CSRF4.3
119 0
Django 模板HTML转义和CSRF4.3
|
前端开发 Python
Django CSRF跨站请求伪造的禁用和使用
Django CSRF跨站请求伪造的禁用和使用
100 0