Title

day56 csrf 认证,ajax通过django的csrf_token认证机制的写法

讲述CSRF(cross-site request forgery), 中文名称: 跨站请求伪造, 也被称为: one click attack/session riding, 缩写为: CSRF/XSRF. 攻击者通过Http请求数据传送到服务器, 从而盗取回话的cookie, 盗取回话cookie之后, 攻击者不仅可以获取到用户的信息, 还可以修改该cookie关联的账户信息

token 字符串的前32位是salt, 后面是加密后的token, 通过salt能解密出唯一的secret.
django会验证表单中的token和cookie中token是否能解出同样的secret, secret一样则本次请求合法.

1, 在响应的页面中加入{% csrf_tiken %}  标签, 那么在进行模板渲染是自动会生成如下标签
<input type="hidden" name="csrfmiddlewaretoken" value="ppwN8yg1wVEyXDxtMpVIrc4zV3gHiDKKb9rwGPLaSGRc0HKhXAwpNrKjGDUHIxjj">

2, 并且在响应还有这个 {% csrf_token %} 标签的页面时, 会添加cookie键值对, 如下
csrftoken:lsMQeJgVbIKKxlfz6umgYM8WOWx1Njr77cHzM0L4xtXoApsnhFXXk1OGzwb1dd0G

3,当用户从该页面提交数据时, 会携带
csrfmiddlewaretoken:ppwN8yg1wVEyXDxtMpVIrc4zV3gHiDKKb9rwGPLaSGRc0HKhXAwpNrKjGDUHIxjj和cookie键值对

4, 取出cookie中的csrftoken值和请求数据部分的csrfmiddlewaretoken的值,两者进行比较, 这个随机字符串叫做token字符串, django如果在请求数据部分找不到token值, 会去请求数据中的请求部分,
找一个叫做X-CSRFTOKEN 的键值对, 如果这个键对应的值和cookie中csrftoken对应的值相同, 也能通过认证

    过程:
        token字符串的前32位是salt, 后面是加密后的token, 通过salt能解密出唯一的secret字符串.
        secret: 是settings配置文件中secret_key:
                                SECRET_KEY = 's!xbzez1zxrevmq7k_89%%-z&#)e7686pyq8pg@_bp_k_2s^ho'
        django会验证表单中的token和cookie中的token是否能解出同样的secret, secret一样则本次请求合法.
            如果不同就403 forbidden

ajax通过django的csrf_token认证机制的写法

方式一:

<script>
        html中:
            {% csrf_token %}

            $('#btn').click(function () {
                var name = $("#username").val();
                var password = $("#password").val();
                var token = $("[name='csrfmiddlewaretoken']").val();

                $.ajax({
                    type: 'post',  // 请求方法
                    url: '/login/', // ajax提交到哪个路径(ajax提交: 页面无刷新提交)
                    // ajax提交的数据, 一定要用data的字典的形式提交
                    data: {xname: uname, pwd: password, csrfmiddlewaretoken: token},
                    success: function (res) {// 上面规定好吧要提交大数据都放入data中,并且要接受到的状态码是通过的,就 会走success并且把参数放到res处进行提交 
                        console.log('success', res); // 这里只是测试打印出什么东西, 实际不用写
                    },
                    error: function* (error) { // 如果接收到的状态吗不对, 就会走快该函数, 并把data数据传到error
                        console.log('error', error);
                        $('#ajax_error').text(error.responseText); // 可以告诉是什么错误


                    }
                })

            })
</script>

方式二

<script>
    $.ajax({
        type: 'post',  // 请求方法
        url: '/login/',
        // {{ csrf_token }}拿到是{% csrf_token %}生成的input标签的那个value属性的token值
        data: {xname:uanme, pwd: password, csrfmiddlewaretoken: '{{  csrf_token }}'}, 
        success: function(res){
            console.log('success',res);
        },
        error:function(error){
            console.log9('error',error);
            $('#ajax_error').text(error.responseText);
        }

    })
</script>

方式三(添加请求头键值对, 键必须叫做: 'X-CSRFTOKEN', 值是cookie中的token值)

<script>
   // 添加请求头键值对, 键必须叫做: 'X-CSRFTOKEN', 值是cookie中的token值
    $.ajax({
        type: 'post',//请求方法
        url: '//login',
        data: {xname:uanme,pwd: password},
        headers:{// 设置请求头键值对
            'X-CSRFTOKEN':$.cookie('csrftoken'),
        },
        success: function(res){
            console.log('sucess',res);
            
        },
        error: function(error){
            console.log('error', error);
            $('#ajax_error').text(error.responseText);
        }
    })
</script>
posted @ 2020-12-06 23:32  侠客行|  阅读(219)  评论(0)    收藏  举报