一、什么是csrf
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。可以理解别人伪造了网站偷了你的cookie,然后进行攻击
二、django中如何使用
在django的setting.py文件中,有中间件插件配置变量名MIDDLEWARE
,其中有一个'django.middleware.csrf.CsrfViewMiddleware'
,这就是django中的csrf中间插件,平常我们使用django进行post的请求时,如果不注释'django.middleware.csrf.CsrfViewMiddleware'
,网站就会403报错,我们如何来开启这个中间件,并解决相应问题
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
先引用方法:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
装饰器:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
- 普通的from提交,
{% csrf_token %}
,会自动在页面生成随机字符串,然后提交给后台:
<form action="/login/" method="post">
{% csrf_token %}
<input name="user" type="text">
<input name="pwd" type="password">
<input type="submit">
</form>
-
ajax版本的提交
image.png
上面的图中发现,其实我们可以通过获取浏览中的csrftoken
字段来验证csrf
<form action="/login/" method="post">
{% csrf_token %}
<input name="user" type="text">
<input name="pwd" type="password">
<input type="submit">
<input id="btn" type="button" value="提交按钮">
</form>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function () {
$('#btn').click(function () {
$.ajax({
url:'/login/',
type:'POST',
data:{"user":'root',"pwd":"root"},
headers:{'X-CSRFtoken':$.cookie('csrftoken')},
success:function (arg) {
alert(arg);
}
})
})
})
</script>
- 统一添加ajax,
csrf
全局配置,场景加一次全局享用
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);
}
}
});
$(function () {
$('#btn').click(function () {
$.ajax({
url:'/login/',
type:'POST',
data:{"user":'root',"pwd":"root"},
headers:{'X-CSRFtoken':$.cookie('csrftoken')},
success:function (arg) {
alert(arg);
}
})
})
})
</script>
···
网友评论