django为用户实现防止跨站请求伪造的功能

需要配置settings.py:

   django.middleware.csrf.CsrfViewMiddleware

1. form表单提交

<form action="/logi/" method="POST">
{% csrf_token %} #需要在form表单中添加{% csrf_token %}
<input type="text" name="user"/>
<input type="text" name="pwd"/>
<input type="checkbox" name="rmb" value="1" /> 10秒免登陆
<input type="submit" value="提交"/>
</form>

  

2. ajax提交方式一

js使用ajax来提交数据,在其中加入csrf
<script src="/static/jquery.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function () {
$('#btn').click(function () {
$.ajax({
url: '/logi/',
type: "POST",
data: {'user': 'root', 'pwd': '123'},
headers: {'X-CSRFtoken': $.cookie('csrftoken')}, #设置csrftoken到http响应头中,其中键是X-CSRFtoken是django固定的键名字
success:function(arg){ }
})
})
})
</script>

  

3. ajax提交方式二

    <script src="/static/jquery.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function () {
$.ajaxSetup({ #使用ajax配置,使用后可以实现本网页所有的ajax请求只写一次配置(ajax全局配置)
beforeSetup: function(xhr,settings) {
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken')); # 在请求头中加入csrftoken来实现所有的ajax请求只配置一次
}
}) $('#btn').click(function () { #以上配置后就不用再ajax中在配置csrftoken了(header: {'X-CSRFtoken': $.cookie('csrftoken')})
$.ajax({
url: '/ind/',
type: "POST",
data: {'user': 'root', 'pwd': '123'},
success:function(arg){
}
})
})
})
</script>

3. ajax提交方式三

    <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) { #判断哪些请求才使用CSRF功能
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function Do(){
$.ajax({
url:"/app01/test/",
data:{id:1},
type:'POST',
success:function(data){
console.log(data);
}
});
}
</script>

  

关于CSRF的django配置:

1. 全局:

在django中的sttings.py配置文件中使用

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',
]

  

2. 局部:

使用django提供的csrf装饰器来实现

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:使用的时候必须导入  from django.views.decorators.csrf import csrf_exempt,csrf_protect

例如:

from django.views.decorators.csrf import csrf_exempt,csrf_protect  #导入django自带的CSRF包

@csrf_exempt   # 加装饰器来实现该函数不需要CSRF认证(全局设置有效)
def login1(request):
pass @csrf_protect # 加装饰器来实现该函数需要CSRF认证(未使用全局设置)
def login2(request):
pass
注:这样可以灵活的使用装饰器来达到函数的定制需求

  

Django-website 程序案例系列-12 CSRF的更多相关文章

  1. Django-website 程序案例系列-17 forms表单验证的字段解释

    1.Django内置字段如下: Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial ...

  2. Django-website 程序案例系列-16 modle.form(表单验证)

    案例程序: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. Django-website 程序案例系列-3 URL详解

    django参考资料:http://docs.30c.org/djangobook2/index.html urls.py是django中控制接收前端的参数指定函数去执行逻辑 第一种 函数的方式 ur ...

  4. Django-website 程序案例系列-18 多表跨表操作优化

    详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 在数据库有外键的时候,使用 select_related() 和 pref ...

  5. Django-website 程序案例系列-15 singnal分析

    在django框架中singnal的应用相当于在你执行某些重要函数语句时在这条语句的前后放置两个预留的钩子,这两个钩子就是singnal,这个钩子也可以理解成两个触发器,当出现执行语句前后是触发执行某 ...

  6. Django-website 程序案例系列-14 缓存的应用配置文件的写法

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  7. Django-website 程序案例系列-13 中间件

    自定义中间件1: from django.utils.deprecation import MiddlewareMixin # 中间件需要引用的包 class Row1(MiddlewareMixin ...

  8. Django-website 程序案例系列-11 验证装饰器

    FBV装饰器: def auth(func): #装饰器函数 def inner(request, *args, **kwargs): v = request.COOKIES.get('usernam ...

  9. Django-website 程序案例系列-10 cookie 和 session的应用

    cookie:  现在所有网站基本都要开启cookie 客户端浏览器上的一个文件 例如:   {‘key’: 'sefwefqefwefw'} 是一个键值对 简单实现cookie认证: user_in ...

随机推荐

  1. GIT 管理修改、删除文件

    管理修改 现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就 ...

  2. ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (转载)

    阅读目录 在Asp.Net Core 中使用外部登陆(google.微博...) 中间件管道 The Authentication Middleware The Challenge 与认证中间件进行交 ...

  3. 使用第三方库(Senparc)完成小程序支付 - z

    https://www.cnblogs.com/zmaiwxl/p/8931585.html

  4. ETL流程介绍及常用实现方法

    ETL是英文Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.常见于数据仓库开发中将数 ...

  5. Mac 启动 ssh 服务

    Mac 本身有 ssh,只是没有默认开启,需要手动开启. 启动 sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 关闭 su ...

  6. squid代理http和https方式上网的操作记录

    需求说明:公司IDC机房有一台服务器A,只有内网环境:192.168.1.150现在需要让这台服务器能对外访问,能正常访问http和https请求(即80端口和443端口)操作思路:在IDC机房里另找 ...

  7. rrd文件及rrd文件与实际数据的对比研究。

    一,什么是rrd文件? 所 谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置.我们可以把用于存储数据的数据库的空间看成一个圆,上 ...

  8. Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)

    转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...

  9. 《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 一.给menuOS增加time和time-asm 通过内核调试系统调用.将上次做的实验加入到menusOS,变成menusOS里面的两个命令. 1 int Getpid(i ...

  10. QQ通信机制(转)

    下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机, ...