Django CSRF

CSRF(Cross-site request forgery)跨站请求伪造

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局

中间件 django.middleware.csrf.CsrfViewMiddleware

局部

@csrf_protect为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

应用

Form提交(CSRF)

在表单中加入{% csrf_token %}
csrf.html:

<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:

<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)
            }
        })
    });
});

通过配置 ajax

$(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)
            }
        })
    });
});

使用

当客户端发出 get 请求后,服务器会通过 Cookie 给客户端发送一个 csrftoken
在客户端发出 post 请求时,需要在请求的 Cookie 中写入 csrftoken,并同时提交隐藏在 form 表单中的 csrfmiddlewaretoken

posted on 2019-05-28 11:30  doubtful  阅读(130)  评论(0编辑  收藏  举报

导航