回到顶部

CONTENTS

django csrf 验证问题及 csrf 原理

相关文档

模板获取 csrf_token 

{{ csrf_token }}  # 在html这样写,前端就会显示它
{% csrf_token %}  # 在html这样写,不会显示,但是会生成一个隐藏的input框,type=hidden

django 模板里 ajax 请求携带 csrf_token 常用做法,view 照常写。

<script>
    // 要直接写在 HTML 文件里,才能用 {{ csrf_token }} 直接获取 csrf_token
    var cur_url = window.location.href;

    function visit_web() {
        var url = "/index/";
        $.ajax({
            url: url,
            data: {
                cur_url: cur_url,
                // 传值 csrf 
                csrfmiddlewaretoken: '{{ csrf_token }}'
            },
            type: "post",
            dataType: "json",
            success: function (responese) {
                if (responese.status === 201) {
                    console.log("访问成功");
                }
            },
            error: function (responese) {
                console.log("访问失败");
            }
        });
    }

    window.onload = visit_web; // 网页加载完成后运行
</script>

前后分离 ajax 请求携带 csrf_token 常用做法(未验证)

1. 直接请求这个接口,就会给浏览器设置 cookie

from django.middleware.csrf import get_token


def get_token(request):
    return JsonResponse({'token': get_token(request)})

2. 然后既可以添加到请求头,也可以直接添加到 请求 data 的 csrfmiddlewaretoken

给 ajax 请求设置请求头

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

// 给 ajax 请求设置请求头 x-csrftoken
$.ajaxSetup({
    beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

对单个视图忽略 csrf 验证

from django.views.decorators.csrf import csrf_exempt


# 给需要忽略的视图加 装饰器 csrf_exempt
@csrf_exempt
def test(request):
    # ...
    returen HttpResponse("Hello World")

 


^_^
请喝咖啡 ×

前一篇: 移动应用分发平台
下一篇: django 撤回(删除) 表更新 操作步骤
captcha
带 * 是必填项