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
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/538180

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。