前提:在之前的访问浏览器,我们都是将setting里的中间件中的csrf给注释掉,不然会无法访问网页
csrf的作用
csrf跨站请求伪造校验
网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识
当这个页面朝后端发送post请求的时候 我的后端会先校验唯一标识,如果唯一标识不对直接拒绝
如何使用csrf
只要在form表单下加入模板语法{% csrf_token %}就可以了
除了form,我们还有个ajax提交方式。
在ajax中有三种方式,书写难度从大到小!
// 第一种 利用标签查找获取页面上的随机字符串
{#data:{“username”:‘jason’,‘csrfmiddlewaretoken’: $(’[name=csrfmiddlewaretoken]’).val()},#}
// 第二种 利用模版语法提供的快捷书写
{#data:{“username”:‘jason’,‘csrfmiddlewaretoken’:’{{ csrf_token }}’},#}
// 第三种 通用方式直接拷贝js代码并应用到自己的html页面上即可
data:{“username”:‘jason’}
以下为js代码
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = 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;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('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);
}
}
});
csrf的一些好用的装饰器
在FBV中
- csrf_protect 需要校验
可以注释掉中间件中的csrf然后在要校验的方法上加入此装饰器
(适用于只用校验少部分方法) - csrf_exempt 忽视校验
可以单单让此方法忽略校验
(适用于校验大部分方法)
在CBV中
csrf_protect三种方式可以全部使用,没有任何不适反应
但是
csrf_exempt只能给dispatch使用,其他方式会报错