Django之CSRF 跨站请求伪造
2016-09-21 23:16
399 查看
一、简介
1、点我了解什么是跨站请求伪造
2、django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能又分为全局和局部。
全局通过修改django中settings文件中中间件列表中的django.middleware.csrf.CsrfViewMiddleware,如果注释该选项,则表示全局不启用,否则表示全局启用
局部
# 该装饰器加在views中的函数上 from django.views.decorators.csrf import csrf_exempt,csrf_protect # 导入装饰器 @csrf_protect # 为当前函数强制设置防跨站请求伪造功能,如果settings中没有设置全局中间件,在views中的函数加上该装饰器,则表示对该函数启用CSRF功能 @csrf_exempt # 取消当前函数防跨站请求伪造功能,如果settings中设置了全局中间件,在views中的函数加上该装饰器,则表示对该函数不启用CSRF功能
二、应用
1、通过form表单提交
csrf.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/csrf/" method="post"> <!-- html通过该simple_tag参数由模板渲染将其转换成一个隐藏的input标签,例如: <input type="hidden" name="csrfmiddlewaretoken" value="9BxEgRk6hMR8bLPwLJs516YHCsNihbK47Lc3CyPASUcXZXS4r9M0j3zz2QOsmJaC"> --> {% csrf_token %} <input type="text" name="v" /> <input type="submit" value="提交" /> </form> </body> </html>
views.py
from django.shortcuts import render from django.views.decorators.csrf import csrf_protect # Create your views here. @csrf_protect def csrf(request): return render(request, 'csrf.html') # 这个地方一定要使用render,因为要对csrf.html中的模板语言进行渲染
2、通过Ajax提交
csrf.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% csrf_token %} <input type="button" onclick="Do();" value="提交"/> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script type="text/javascript"> {# 从cookie中拿到csrftoken #} var csrftoken = $.cookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } {# 当所有ajax发送数据之前都执行以下这个配置,自动将cookie中的csrftoken加入到request中的head中 #} $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); function Do(){ $.ajax({ url:"/csrf/", data:{id:1}, type:'POST', success:function(data){ console.log(data); } }); } </script> </body> </html>
views.py
from django.shortcuts import render from django.views.decorators.csrf import csrf_protect @csrf_protect def csrf(request): return render(request, 'csrf.html')
点我查看官方详细说明
相关文章推荐
- Django框架全面讲解 -- 跨站请求伪造(csrf)
- 第三百一十五节,Django框架,CSRF跨站请求伪造
- django如何防止csrf(跨站请求伪造)
- 自动化运维Python系列之Django CSRF跨站请求伪造、中间件 推荐
- django上课笔记3-ORM补充-CSRF (跨站请求伪造)
- 解决django出现CSRF token missing or incorrect.错误
- django关于csrf防止跨站的ajax请求403处理
- 程序猿必读-防范CSRF跨站请求伪造
- Django添加防跨站请求伪造中间件
- 跨站请求伪造(CSRF/XSRF)
- 详解Django的CSRF认证实现
- Django跨域请求CSRF的方法示例
- 对CSRF(跨站请求伪造)的理解
- django 处理POST请求时报403 -- csrf
- Django之Form、CSRF、cookie和session
- django中给ajax提交加上csrf
- django-CSRF verification failed. Request aborted
- 【转】关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
- Django框架之跨站请求伪造
- Python开发【Django】:中间件、CSRF