关于Django Ajax CSRF 认证
CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
Django 中自带了 防止CSRF攻击的功能,但是一些新手不知道如何使用,给自己编程带来了麻烦。常常会出现下面django csrf token missing or incorrect的错误。
GET 请求不需要 CSRF 认证,POST 请求需要正确认证才能得到正确的返回结果。一般在POST表单中加入 {% csrf_token %}
| 1 2 3 4 5 | <formmethod="POST"action="/post-url/">    {% csrf_token %}        <inputname='zqxt'value="自强学堂学习Django技术"></form> | 
如果使用Ajax调用的时候,就要麻烦一些。需要注意以下几点:
- 在视图中使用 render (而不要使用 render_to_response) 
- 使用 jQuery 的 ajax 或者 post 之前 加入这个 js 代码:http://www.ziqiangxuetang.com/media/django/csrf.js 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | jQuery(document).ajaxSend(function(event, xhr, settings) {    functiongetCookie(name) {        varcookieValue = null;        if(document.cookie && document.cookie != '') {            varcookies = document.cookie.split(';');            for(vari = 0; i < cookies.length; i++) {                varcookie = jQuery.trim(cookies[i]);                // Does this cookie string begin with the name we want?                if(cookie.substring(0, name.length + 1) == (name + '=')) {                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));                    break;                }            }        }        returncookieValue;    }    functionsameOrigin(url) {        // url could be relative or scheme relative or absolute        varhost = document.location.host; // host + port        varprotocol = document.location.protocol;        varsr_origin = '//'+ host;        varorigin = protocol + sr_origin;        // Allow absolute or scheme relative URLs to same origin        return(url == origin || url.slice(0, origin.length + 1) == origin + '/') ||            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||            // or any other URL that isn't scheme relative or absolute i.e relative.            !(/^(\/\/|http:|https:).*/.test(url));    }    functionsafeMethod(method) {        return(/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));    }    if(!safeMethod(settings.type) && sameOrigin(settings.url)) {        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));    }}); | 
或者 更为优雅简洁的代码(不能写在 .js 中,要直接写在模板文件中):
| 1 2 3 | $.ajaxSetup({    data: {csrfmiddlewaretoken: '{{ csrf_token }}'},}); | 
这样之后,就可以像原来一样的使用 jQuery.ajax() 和 jQuery.post()了
最后,附上一个 Django Ajax CSRF 实例
关于Django Ajax CSRF 认证的更多相关文章
- python学习-- Django Ajax CSRF 认证
		使用 jQuery 的 ajax 或者 post 之前 加入这个 js 代码:http://www.ziqiangxuetang.com/media/django/csrf.js /*======== ... 
- Django:之传递数据给JS、Ajax和Ajax CSRF认证
		Django传递数据给JS 有时候我们想把一个list或者dict传递给javascript,处理后显示到网页上,比如要用js进行可视化到数据. 请注意:如果是不处理,直接显示在网页上,用Django ... 
- vue-element-admin 模板 登录页面 post请求通过django的csrf认证,处理304错误
		经过一天的研究,终于把 vue-admin-template 模板的 post 请求 和django的api 弄通了 没有了那该死的304报错了 直接贴代码: 在main.js中 我直接给设置了一个 ... 
- 详解Django的CSRF认证
		1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次发送post,put或delete请求时携带 ... 
- Django AJAX csrf
		1.原始 a.在HTML中添加 {% csrf_token %} b.在data中添加csrf_token对应input的 键值对 "csrfmiddlewaretoken" : ... 
- Django Ajax登录 防止CSRF
		什么是CSRF 维基百科: 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CS ... 
- django  CBV装饰器 自定义django中间件  csrf跨站请求伪造  auth认证模块
		CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ... 
- Django与CSRF 、AJAX
		CSRF(Cross-site request forgery)跨站请求伪造,是一种常见的网络攻击手段,具体内容和含义请大家自行百度. Django为我们提供了防范CSRF攻击的机制. 一.基本使用 ... 
- django框架进阶-CSRF认证
		############################################### """ django中csrf的实现机制 #第一步:django第一次响应 ... 
随机推荐
- css上传图片中等待不可点击效果
			<!DOCTYPE html> <html> <head> <title>上传中</title> <style type=" ... 
- union排序,起别名将两个不同的字段ZCDZ,SCJYDZ 变成同一个别名dz,进行排序;增加一个字段z,进行排序。
			with a as( select NSRSBH,NSRMC,ZGSWJ_DM,ZGSWSKFJ_DM,SSGLY_DM,FDDBRXM,ZCDZ dz,1 z from hx_dj.dj_nsrxx ... 
- CentOS7 中文man(cman)配置方法
			1. 下载中文man包 http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd ... 
- gradle修改apk包名和apk文件名
			需求1:根据渠道不同给包名添加不同的后缀名 方案: //先定义默认包名,用来复用 def packageName = "xxx.xxxx.xxxx" defaultConfig { ... 
- spring注解工具类AnnotatedElementUtils和AnnotationUtils
			一.前言 spring为开发人员提供了两个搜索注解的工具类,分别是AnnotatedElementUtils和AnnotationUtils.在使用的时候,总是傻傻分不清,什么情况下使用哪一个.于是我 ... 
- Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和区别
			https://blog.csdn.net/yunfeng482/article/details/72856762 
- Java笔记(十七) 异步任务执行服务
			异步任务执行服务 一.基本原理和概念 一)基本接口 1)Runnable和Callable:表示要执行的异步任务. 2)Executor和ExecutorService:表示执行服务. 3)Futur ... 
- JavaScript基础笔记(十二)Ajax
			Ajax 一.XMLHttpRequest对象 一)XHR用法 var xhr = new XMLHttpRequest(); //open()方法,参数一:发送方法,参数二:请求的URL,参数三:是 ... 
- C# 结合html5 批量上传文件和图片预览
			html5 新特性 <input id="imgsf" type="file" name="imgsf" multiple /> ... 
- BZOJ3536 : [Usaco2014 Open]Cow Optics
			枚举最后光线射到终点的方向,求出从起点出发以及从终点出发的光路,扫描线+树状数组统计交点个数即可. 注意当光路成环时,对应的两个方向应该只算一次. 时间复杂度$O(n\log n)$. #includ ... 
