Django之CSRF

简介:

一、什么是CSRF

    CSRF, Cross Site Request Forgery, 跨站伪造请求。举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。

    Django为用户实现跨站请求伪造保护的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局设置和局部设置。


二、Django提供CSRF防护机制

    Django第一次响应某个客户端的请求时,会在服务器端随机生成一个token,然后把这个token放到cookie中返回给客户端。然后客户端每次POST请求时都会带上这个token,这样就避免了CSRF攻击。

  • 在返回的HTTP响应的cookie中,Django会添加一个csrftoken字段,值为随机生成的token

  • 在POST表单中,必须包含一个csrfmiddlewaretoken隐藏字段,需要在模板中添加{% csrf_token %}自动生成

  • 在处理POST请求之前,Django会验证cookie中csrftoken和表单中csrfmiddlewaretoken的值是否一致。如果一致,则表明这是一个合法请求。否则这个请求就是伪造的,返回403 Forbidden。

  • 在Ajax POST请求中,添加一个"X-CSRFToken"头部,值为cookie中的csrftoken的值。


三、CSRF设置

1. 全局设置(中间件)

1
django.middleware.csrf.CsrfViewMiddleware

2. 局部设置(视图函数)

1
2
3
4
5
6
7
8
9
from  django.views.decorators.csrf  import  csrf_exempt,csrf_protect
 
@csrf_protect   # 为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置CSRF中间件。
def  func():
     pass
     
@csrf_exempt   # 取消当前函数防跨站请求伪造功能,即便settings中设置了CSRF中间件。
def  func():
     pass


四、应用CSRF

1. 前端Form表单中设置CSRF

1
2
3
4
<form method = "post" >
{ %  csrf_token  % }
     ...
< / form>

2. 自动在每个Ajax请求头部中添加"X-CSRFToken"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/ /  导入jquery.cookie.js 通过$.cookie( 'csrftoken' )获取csrf_token
/ /  beforeSend在每个Ajax请求之前自动设置请求头部 "X-CSRFToken"
 
<script src = "/static/plugin/jquery/jquery-1.8.0.js" >< / script>
<script src = "/static/plugin/jquery/jquery.cookie.js" >< / script>
<script  type = "text/javascript" >
     var csrftoken  =  $.cookie( 'csrftoken' );
 
     function csrfSafeMethod(method) {
         / /  these HTTP methods do  not  require CSRF protection
         return  ( / ^(GET|HEAD|OPTIONS|TRACE)$ / .test(method));
     }
     $.ajaxSetup({
         beforeSend: function(xhr, settings) {
             if  (!csrfSafeMethod(settings. type ) && !this.crossDomain) {
                 xhr.setRequestHeader( "X-CSRFToken" , csrftoken);
             }
         }
     });
< / script>

3. 单独在Ajax请求中设置"X-CSRFToken"头部

1
2
3
4
5
6
7
8
<script src = "/static/plugin/jquery/jquery-1.8.0.js" >< / script>
<script src = "/static/plugin/jquery/jquery.cookie.js" >< / script>
<script  type = "text/javascript" >
     $.ajax({
         headers:{ "X-CSRFToken" :$.cookie( 'csrftoken' )},
         ...
         })
< / script>

本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/2044282如需转载请自行联系原作者

daibaiyang119
相关文章
|
4天前
|
存储 JavaScript 前端开发
Django的CSRF防攻击原理详解
Django的CSRF防攻击原理详解
|
4天前
|
存储 中间件 数据安全/隐私保护
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)保护
117 0
|
安全 前端开发 中间件
谈谈Django的CSRF插件的漏洞
谈谈Django的CSRF插件的漏洞
126 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