csrftoken
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。攻击者通过HTTP请求江数据传送到服务器,从而盗取回话的cookie。盗取回话cookie之后,攻击者不仅可以获取用户的信息,还可以修改该cookie关联的账户信息。
解决csrf攻击的最直接的办法就是生成一个随机的csrftoken值,保存在用户的页面上,每次请求都带着这个值过来完成校验。
form表单提交
form表单进行csrftoken验证时需要在表单内部添加{% csrf_token %}
<form action="" method="post">
{% csrf_token %}
<input type="text" id="uid">用户名<br>
<input type="password" id="pwd">密码<br>
<input type="submit" value="提交">
</form>
{% csrf_token %}
会自动变成一个隐藏的input标签
,form表单提交时会将这个隐藏的标签的数据也进行提交
<input type="hidden" name="csrfmiddlewaretoken" value="d8tUZvCD6pznb2ENdab0tOli0zcnmt1UQm0dUG0zqt6v9Nb4DA4Mi9FcyKnpBj6K">
ajax提交
ajax进行提交时,也需要在页面添加{% csrf_token %}
,因为是需要通过js获取值,所以添加到form表单外部也没问题
方式一
$("#bu").click(function () {
var uid = $("#uid").val();
var pwd = $("#pwd").val();
$.ajax({
url:"/login/",
type:"post",
data:{
"uid":uid,
"pwd":pwd,
"csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()
//手动获取{% csrf_token %}转换成隐藏input标签的值
},
success:function (res) {console.log(res)}
})
});
方式二
$("#bu").click(function () {
var uid = $("#uid").val();
var pwd = $("#pwd").val();
$.ajax({
url:"/login/",
type:"post",
data:{
"uid":uid,
"pwd":pwd,
csrfmiddlewaretoken:"{{ csrf_token }}" // 获取csrf_token
},
success:function (res) {console.log(res)}
})
});
方式三
<script type="text/javascript" src="/static/js/jquery.cookie.js"></script> //导入jquery.cookie.js
<script>
$("#bu").click(function () {
var uid = $("#uid").val();
var pwd = $("#pwd").val();
$.ajax({
//自定制请求头
url:"/login/",
type:"post",
data:{"uid":uid, "pwd":pwd,},
headers:{"X-CSRFToken":$.cookie("csrftoken")},
success:function (res) {console.log(res)}
})
});
</script>
装饰器
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 指定次函数不进行csrf认证
@csrf_exempt
def index(request):
pass
# 指定次函数必须进行csrf认证
@csrf_protect
def index(request):
pass