CSRF(跨站请求伪造)
用户请求获取数据时,加入一段加密字符串,只有服务器能反解。
XSS(跨站脚本攻击),JS脚本在网站中运行,如果获取到用户Cookie,可以利用Cookie实现登录。
CSRF验证使用户提交数据时,如果不带上加密字符串不允许登录。
所以发送给客户端的页面中要加上CSRFtoken,这样,下次客户端再次请求时就会有加密后的随机字符串
settings.py中间件CSRF
'django.middleware.csrf.CsrfViewMiddleware'
开启这个功能,默认Django的所有post请求如果不带上csrftoken不允许请求页面
1.一般不这么发,会放在请求头中发送
<form action>
{%csrf_token%}
</form>
2.Ajex请求带上CSRF
一般来说如果在请求头中添加数据key-mysql,那么Django会在最终的请求头的把key改变为HTTP_KEY(下划线非法)
我们的CSRF也默认在请求头中传递,键名为HTTP_X_CSRFTOKEN -----> X-CSRFtoken
这样传递就会通过CSRF的验证中间件
①$('#i1').click(function(){
var csrf_token = $.cookie('csrf_token')
$.ajax({
url:'xxx',
type:'post',
data:{ 'username':xxx,'password':123123 }
headers:{ 'x-CSRFtoken':csrf_token }
success:function(arg){
}
})
})
②Ajax整个页面统一配置
xhr 是 XMLHttpRequest对象,默认Ajax底层使用的就是它
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) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
大多数请求需要CSRF验证
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.csrf import csrf_protect
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
少数请求需要CSRF验证
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。