Django CSRF

CSRF(Cross-site request forgery)跨站請求僞造

django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。html

全局

中間件 django.middleware.csrf.CsrfViewMiddlewarejquery

局部

@csrf_protect爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。
@csrf_exempt取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。ajax

應用

Form提交(CSRF)

在表單中加入{% 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)

經過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)
            }
        })
    });
});
相關文章
相關標籤/搜索