2012-08-14 56 views
2

我對這裏的許多作品(Django/Ajax等)都陌生,所以雖然我理解高級CSFR圖片,但我沒有完整的細節處理。Django中間件用HTTPS POST使用ajax拋出403錯誤

由於傳遞的數據量較大,我需要將GET請求轉換爲PUT。高級別,我正在通過HTTPS對django應用程序進行AJAX POST API調用。該呼叫是從頁面所在的同一個域進行的。

但是,我不斷收到'CSRF cookie未設置'的錯誤。

我使用Django 1.4

爲了突破CSRF保護,我已經包含了X-CSFRToken視爲頁眉其他職位提到這裏包括{{csrf_token}}在發佈數據標籤。但是,它看起來不像標籤被替換爲標記。 X-CSFRToken值在請求中作爲NULL發送。不知道爲什麼它沒有設置。

我的印象是,我不需要在頁面視圖中使用ensure_csrf_cookie(),因爲我在ajaxSetup中的POST之前獲取了cookie,但我也嘗試了這一點。

想法我做錯了什麼?

相關代碼:

siteUrl = "https://localhost:8443/" 

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     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]); 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
     } 
     if (new RegExp("^"+siteUrl.replace("\\","\\\\")+".*").test(settings.url)) { 
      // Only send the token to URLs from our site. 
      xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
     } 
    } 
}); 


$.ajax({ 
    url: submitUrl, 
    data: {'network_ids': JSON.stringify(network_ids), 
      'csrfmiddlewaretoken': '{{ csrf_token }}'}, 
    type: 'POST', 
    crossDomain: true, 
    dataType: 'json', 
    cotentType: 'application/json', 
    success: function(mydata) { 
     console.log(mydata); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) {alert(textStatus); alert(errorThrown)} 
}) 

回答

1

您有幾種選擇: 該代碼清單顯示你從cookie獲取CSRF令牌:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

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; 
} 
getCookie('csrftoken'); 

和假設的JavaScript函數提交到Django視圖,你可以告訴視圖忽略csrf保護。 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    return HttpResponse('Hello world') 
0

是您的JS通過Django的模板引擎服務?否則{{ csrf_token }}將不會被評估。你有沒有檢查過它是否被髮送到服務器?

而且根據docsajaxSend事件背後的想法是,你必須通過csrf_token明確。

我注意到您的ajaxSetup與文檔中的略有不同。這可能是正確的,但我會從文檔複製原件。