X-CSRF攻击。
黑客可以将被人的cookie拿走。
黑客可以用这个cookie来登录。
CSRF原理:
你们来我服务器请求,第一次请求来要数据,我不仅仅给你了数据,还给你了一个加密后的字符串。
其他的参考
需要怎么做:
settings.py中需要有 django.middleware.csrf.CsrfViewMiddleware 这个中间件
每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag
每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header
我们不要吧settings.py
中的中间件'django.middleware.csrf.CsrfViewMiddleware'
注释掉,它是来保护我们的。
在模板中:
{{ csrf_token }} # 这样就会显示它
{% csrf_token %} # 不会显示,但是会存在于模板
后者会在html中生成一个隐藏的input框,type=hidden
。
在cookie中也生成了csrftoken。
图片.png如果ajax发送的话,那么需要在cookie中取得到csrftoken,放在请求头再发过去。
1)form提交的时候,将csrf_token带过去:
<form action="/cookie/login/" method="post">
{% csrf_token %}
<input type="text" name="username">
<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
</body>
</html>
2)如果ajax提交:
我们可以从上面的在cookie中也生成了csrftoken
,取出然后传递过去。
示例:
js方式提交数据。
<body>
<form action="/cookie/login/" method="post">
{% csrf_token %}
<input type="text" name="username">
<input type="text" name="pwd">
<input type="submit" value="提交">
<input id="btn" type="button" value="按钮">
</form>
<script src="/static/js/jquery.cookie.js"></script>
<script src="/static/js/jquery-2.1.4.min.js"></script>
<script>
$(function(){
$("#btn").click(function(){
$.ajax({
url:'/cookie/login/',
type:"POST",
data:{'user':'root', 'pwd':'123'},
success:function(response){
}
})
})
})
</script>
两种方式提交:
1)form 表单提交
<form action="/cookie/login1/" method="post">
{% csrf_token %}
<input type="text" name="username">
<input type="text" name="pwd">
<input type="submit" value="add">
<input id="btn" type="button" value="button-add">
</form>
2)ajax提交
<script>
$(function(){
// ajax设置
$.ajaxSetup({
// 发送ajax之前,执行以下这个函数
beforeSend:function(xhr, settings){ // xhr=XmlHttpRequest 对象,所有ajax请求底层操作都是使用的它来做的
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
}
});
// 添加点击事件
$("#btn").click(function(){
$.ajax({
url:'/cookie/login1/',
type:"POST",
headers:{'X-CSRFtoken':$.cookie('csrftoken')},
data:{'username':'root', 'pwd':'123'},
success:function(response){
}
})
})
})
</script>
部分函数不需要CSRF或者说部分函数需要CSRF的处理方法
1)通过装饰器csrf_protect
和csrf_exempt
来进行
from django.views.decorators.csrf import csrf_protect, csrf_exempt
@csrf_exempt # 不需要csrf认证
def me1(request):
pass
@csrf_protect # 需要csrf认证
def me2(request):
pass
2)通过通过请求方式来区分加还是不加csrf
图片.png
网友评论