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. Android 让图片等比例缩放的三种方法

    方法一:客户端等比例 前提条件:服务器端需要返回原始图片的“宽和高”或者“宽高缩放比例”,客户端要显示的图片的宽或者高只要其一是固定的(例如:高度为200,宽度未知,或者高度为400宽度未知) 在这种 ...

  2. JavaScript设计模式 - 策略模式(表单验证)

    表单提交的时候,总是要校验,不同的表单可能校验相同的功能. 为了避免代码重复的复制黏贴,使用策略模式,写出来的代码赏心悦目,且可扩展,还可以作为插件到处使用 <!DOCTYPE html> ...

  3. 车轮升级PHP7踩过的一些坑

    社区php7升级记录 社区服务器已经全部完成升级,这里记录一下社区升级php7所遇到的问题,可以分为四个类型 扩展支持的变化,导致需要修改配置甚至调整替换操作的类库 php7语法检查比之前变得严格,部 ...

  4. eclipse调试断点【转载】

    该片博文是转载他人的博客,原博客地址:http://blog.csdn.net/maritimesun/article/details/7815903 作为开发人员,掌握开发环境下的调试技巧十分有必要 ...

  5. Multiple Threads reading from the same file(转载)

    问 I have a xml file that needs to be read from many many times. I am trying to use the Parallel.ForE ...

  6. java线程池和中断总结

    目录 java线程池和中断总结 一. 线程池的使用 二. java中断机制 中断的处理 三. 线程间通信机制总结 java线程池和中断总结 本系列文是对自己学习多线程和平时使用过程中的知识梳理,不适合 ...

  7. 【php增删改查实例】第二十一节 - 用户修改功能

    19.1 添加用户修改的按钮 打开userManage.html,找到新增按钮的地方: 我们不难发现,编辑按钮就差不多应该在新建用户的右边. 那么,假如我现在是新人,对这个项目本身就不太熟悉,那么我得 ...

  8. 树莓派 Raspberry Pi 更换国内源

    http://www.shumeipaiba.com/wanpai/jiaocheng/16.html

  9. js格式化时间

    转自:https://blog.csdn.net/u010964869/article/details/51095827 显示格式为:yyyy-mm-dd hh:mi:ss function form ...

  10. 个人阅读作业WEEK7 (软件工程的瀑布, 大泥球, 教堂,集市,和银弹)

    一 . 关于银弹 (Silver Bullet) 银弹,被引申为解决问题的有效办法.IBM大型机之父福瑞德·布鲁克斯在1986年的论文<没有银弹>中表达了他的观点:软件工程中不存在银弹—— ...