1. 程式人生 > >如何解決Django中CSRF問題

如何解決Django中CSRF問題

 

 

CSRF是什麼?

CSRF(Cross Site Request Forgery,跨站偽造請求)。舉個例子來簡單介紹下。有A、B兩個web網站,其中A網站存在CSRF漏洞,B網站是攻擊者特意設計成一個具有CSRF攻擊性的網站,C為一普通使用者,當用戶C在瀏覽器中登入A網站後,A網站會將使用者的登入資訊如cookie返回並儲存在瀏覽器,如果使用者C在瀏覽器中再訪問B網站,B網站會誘導使用者C執行一個點選操作之類的,這個時候B網站就可以使用使用者C在A網站的登入態並偽造使用者C向網站A發起請求,而網站A卻不能分辨這個請求是來自於惡意攻擊網站B。因此為了網站的安全,我們都需要做CSRF防禦,確保每一次請求都是合法的。

 

Django中怎麼實現CSRF校驗?

Django不同版本對於csrf問題處理方式不太一樣,我用的Django2.0,在使用ajax請求時出現了csrf問題,網上找了一大堆的解決方案,有新增 @csrf_protect,有改settings.py檔案的,有改render方式等等,都沒有解決我的問題,去了Django官網搜了下ajax csrf關鍵字,按照官網提供的解決方案,csrf問題很快得到解決,先附上官方解決方案連結,主要是在html中增加下面幾段js程式碼即可。

 

<script type="text/javascript">

    // 獲取csrftoken
    var csrftoken = getCookie('csrftoken');

    $.ajax({
        url:'xxx',
        type:'POST',
        data:{},
        dataType: 'json',
        beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                },
        success:function(r){    

        },  
    })

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

    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
       return cookieValue;
    }

</script>