2016-07-07 71 views
1

我正在使用django rest框架。我有Ember前端。在這裏,當我從Cookies.get(「csrftoken」)獲取csrftoken時,它與我在瀏覽器cookie中看到的csrftoken不同。document.cookie中csrftoken的值與Cookies中的csrftoken不同

這裏是一個屏幕截圖:

enter image description here

看到,在cookie中的csrftoken是從X-CSRFToken(由Cookies.get設置( 「csrftoken」))不同。

他們爲什麼不同?我需要他們兩個一樣。請幫忙。

回答

0

在發送請求之前,您應手動設置X-CSRFToken。 Django文檔包含有關很好的例子: https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax

這是關於JQuery的,但你應該把握的想法:

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

思想如下:服務器發送給您Cookie中的CSRF令牌,你的客戶讀cookies並在標題中設置令牌。服務器讀取請求標頭,看到好的X-CSRFToken並知道該請求是有效的。

+0

是的。我知道。這就是我所說的。設置X-CSRFToken後,csrf與我在Cookie中看到的不同。 – Rishi

+0

對不起,您沒有告訴您將您的csrf-token設置爲「X-CSRFToken」標頭。只有你從cookies讀取它,這與Ember發送的'X-CSRFToken'值不同。也許我誤解了。 – prokaktus

0

在django 1.10。爲了防止BREACH攻擊,CSRF保護機制現在改變每個請求的表單標記值(同時保留一個不變的祕密,可用於驗證不同的標記)。 也許你的Django版本是1.10 docs

相關問題