Django中關於csrf_token的認證

1、介紹:css

  爲了網站網站的安全,防止XSS等惡意數據性攻擊。Django中提供了一個模塊用以提供csrf認證。在使用以前咱們先介紹下在Django中csrf的認證原理。
   csrf原理:在訪問是會先發送一個GET的請求,將本身生成的驗證字符串存放在客戶端的cookie中,當客戶端發送POST請求時,需攜帶該字符串進行認證。
html

二.認證方式:前端

  1.客戶端直接post請求認證:
ajax

    在前端的form表單中直接添加 {% csrf_token %}即可經過認證django

<form action="/login/" method="POST">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="text" name="pwd" />
        <input type="submit" value="提交" />
</form>

  2.客戶端用ajax方式提交認證:json

   2.1:在ajax中添加X-CSRFToken的請求頭,必須從cookie中取csrftoken的值(對單一ajax請求處理)安全

$.ajax({
            type: "POST",
            url:"/login/",
            dataType: "json",
            headers: {'X-CSRFtoken': $.cookie('csrftoken')},
            data:{
                "account_code":$('#account_login').find("input[name=account_code]").val(),
                "pwd":$.sha256(pwd_const+$('#account_login').find("input[name=pwd]").val()),
            },
            error: function(request) {
                alert("Connection error");
            },
            success: function(data) {
                var success = data.status;
                if (success) {
                    window.location="/login/home/";
                } else {
                    $("#msg-info").html(data.message).css('color', 'red');
                    $('#msg-info').show();
                }
            }
        });

 2.2:使用$.ajaxSetup()給全局的ajax添加默認參數cookie

        $.ajaxSetup({
                beforeSend: function(xhr,settings){
                    xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
                }
            });

   注意:使用ajax提交數據時,若是咱們前端沒有csrf_roken的值會驗證失敗。此時咱們還須要在客戶端添加一個裝飾器ensure_csrf_cookie(),使服務端提早發送csrf_token用以驗證post

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def login(request):
    return render(request, 'login.html')
相關文章
相關標籤/搜索