CSRF简介: CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
在django中默认就已经开启了针对CSRF的处理,在settings.py中的 ‘django.middleware.csrf.CsrfViewMiddleware’, 就是开启对CSRF的处理,此时如果通过POST方式提交表单,必须在表单内加入 {% csrf_token %},否则将不会提交成功。
对于 csrf_token 有两种方式,一种是 {{ csrf_token }},另外一种是 {% csrf_token %},前者试将django后台生成的 token 以字符串的形式展示,后者,是以 input 标签的形式,并且隐藏了起来,就是这样的:
<input type="hidden" name="csrfmiddlewaretoken" value="YeqAWDoi4wfNThhzDsJLVx25SY1ped81QGNIihooav5mRrt5nghVZeQvTl9HWSaL" />"
通过ajax方式发送post请求时 CSRF 的认证。
<body>
{% csrf_token %} # 生成一个 input 标签,其值就是 token
<input type="text" name="name"/><br>
<input type="submit" value="提交">
<button class="sub">AJAX提交</button>
</body>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script>
$(function () {
$(".sub").click(function(){
var token = $('input[name="csrfmiddlewaretoken"]').val() # 获取带有token的那个 input 标签的值
var user = $('input[name="name"]').val()
$.ajax({
url: '/test1/',
type: 'POST',
headers: {"X-CSRFToken": token}, # X-CSRFToken 是 django 要求的,不能改
data: {"user": user},
success: function (res) {
console.log(res)
}
})
})
})
</script>