目录

Django的csrf防御机制

前景:

Html页面的表单没有完全使用Django的form进行渲染,故Js不能使用$('#ClassID').serialize()来获取CsrfData,然后报错CSRF token missing or incorrect.

原因:

Django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个Token,把这个Token放在Cookie里。然后每次Post请求都会带上这个Token, 这样可以能避免被Csrf攻击。所以会在每个Html模板中增加一个 {% csrf_token %}标签。

视图函数返回Csrf的三种方式

1
2
3
4
5
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

return HttpResponse(_template.render(context, request))

return render(request, 'xxx.html', data)

Html中的展现形式

/img/img60.png

解决

1.通过Js先获取到Csrf值

1
2
3
<script>
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
</script>

2.通过在Ajax设置请求头传递

1
2
3
4
5
<script>
    $.ajax({
        headers: {'X-CSRFToken': csrf_token},     
    })
</script>