django为用户实现防止跨站请求伪造的功能,经过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。html
中间件 django.middleware.csrf.CsrfViewMiddleware
jquery
@csrf_protect
为当前函数强制设置防跨站请求伪造功能,即使settings中没有设置全局中间件。
@csrf_exempt
取消当前函数防跨站请求伪造功能,即使settings中设置了全局中间件。ajax
在表单中加入{% csrf_token %}
csrf.html:django
<form action="/csrf.html" method="post"> {% csrf_token %} <input type="text" name="username" placeholder="username"> <input type="submit" value="form submit"> </form>
经过Ajax提交表单时须要处理请求头
CSRF请求头: 'X-CSRFToken'
csrf.html:cookie
<form> <input type="text" name="username" id="username" placeholder="username"> <input type="submit" id="submit" value="ajax submit"> </form> <script src="/static/jQuery.js"></script> <script src="/static/jquery.cookie.js"></script> <script src="/static/csrf.js"></script>
csrf.js:
经过添加 headers函数
$(function () { $('#submit').click(function () { $.ajax({ url: '/csrf.html', type: 'POST', data: {'username': $('#username').val()}, headers: {'X-CSRFToken': $.cookie('csrftoken')}, success: function (data) { alert(data) } }) }); });
经过配置 ajaxpost
$(function () { $.ajaxSetup({ beforeSend: function (xhr, settings) { xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken')) } }); $('#submit').click(function () { $.ajax({ url: '/csrf.html', type: 'POST', data: {'username': $('#username').val()}, success: function (data) { alert(data) } }) }); });