2017-08-13 41 views
1

我的基本目標是將某些數據從chrome插件發送到Django服務器。到目前爲止,我的基本嘗試看起來是這樣的:如何在Chrome插件中使用CSRF令牌/從其他來源

  1. 使用javascript捕獲插件代碼中的數據。

    loginData = { 
        'username': document.getElementById("login-email").value, 
        'password': document.getElementById("login-password").value 
    }; 
    
  2. 使用REST框架將其發送給Django。

    csrfToken = getCookie('csrftoken'); 
    
    $.ajax(login_url, { 
        type: 'post', 
        data: JSON.stringify(loginData), 
        contentType: 'application/JSON', 
        dataType: 'json', 
        headers: { 
         'HTTP_X_CSRFTOKEN': csrfToken 
        }, 
        success: function (data, status, XhrObj) { 
         // Do some stuff 
        }, 
        error: function (XhrObj, status, error) { 
         // Do some other stuff 
        } 
    }); 
    

在那裏我卡住是我不斷收到錯誤響應{"detail":"CSRF Failed: CSRF token missing or incorrect."}我試圖跟隨the instructions listed in Django's documentation for adding the CSRF header into requests,但是getCookie功能他們宣稱那裏,因爲頁面,我從做這個總是返回null不是來自該域(請記住它在Chrome插件的「域」中),因此無法訪問我的cookie(正確如此)。

在那篇文檔中,他們提到「如果激活CSRF_USE_SESSIONS,則必須在您的HTML中包含CSRF標記,並使用JavaScript從DOM讀取標記。」但是,在你的HTML中不包括這個標記完全打敗了CSRF標記的目的?即它允許攻擊者終端獲得一個有效的CSRF令牌,然後他們可以用它來執行惡意攻擊,是正確的?

我也考慮過能夠get the cookie value directly from the AJAX response,但是這也被阻止,以防止我試圖做的「攻擊」的確切類型。

我確實看到當我檢查名爲'csrftoken'的cookie與我的請求一起發送的流量時,所以我想我也有點困惑,爲什麼Django希望我將它拉出來HTTP頭,而不是從已經發送的cookie中讀取它。

所以,我想,有兩個問題:

  1. 不Django的包括在HTML的CSRF令牌徹底擊垮的目的說CSRF令牌?
  2. 將數據提交到遠程API而不打開Chrome擴展的安全漏洞的方式是什麼?
+0

Re:從另一個域獲取cookie,可以使用chrome.cookies API。 – wOxxOm

回答

0

所以我實際上最終自己解決了這個問題(儘管@ wOxxOm指出了我的正確方向)。

兩件事情需要改變,使其工作:

  1. 除了使用得到的cookie Django的建議辦法,我只好用chrome.cookies API通過wOxxOm的建議。
  2. 將http標題從HTTP_X_CSRFTOKEN更改爲X-CSRFToken

感謝您的幫助,並希望這可以幫助別人!

另外,關於我的第一個問題,事實證明,CSRF令牌包含在cookie中的CSRF令牌的散列表中,並且這兩種形式都必須存在於django生成的表單中,通過CSRF驗證,as documented in the Django documentation