2017-09-13 144 views
0

我使用純粹的JavaScript來訪問使用Spring構建的某些Web服務。當我試圖對使用CSRF時遇到的問題之一使用Ajax Post調用。使用Ajax的無效CSRF令牌

的Ajax調用的線條:

var data = {'attribute1':'1','attribute2':'2'}; 

$.ajax({ 
    type: "POST", 
    url: url, 
    data: data, 
    success: function(data) 
    { 
     if (typeof inputId !== 'undefined') { 
      $("#"+inputId).val(JSON.stringify(data)); 
     } 
     console.log(JSON.stringify(data));  
    } 
    }); 

我一直在網上搜索,但所有我發現是更新後端(JSP,PHP)來填充屬性「$ {_ CSRF。 parameterName}「。 但是,我沒有使用任何後端,所有的頁面只是HTML和JavaScript。

回答

1

CSRF_Token是一個cookie,由您的web框架/服務器發送並存儲在瀏覽器中。通常,當您通過ajax調用發佈時,您需要將CSRF_Token值作爲JSON數據的一部分發送。爲此,您需要使用JavaScript來查找cookie名稱並獲取該值。比您需要將值分配給服務器期望看到的正確變量名稱。例如,

var data = { crsf_token_name_server_expects: csrf_token_value_I_obtained }; 

的CSRF_Token用於確保人與您的溝通API實際訪問你的網站,並試圖POST數據到它之前創建一個有效的會話。 google.com上的用戶不能發佈到stackoverflow.com,除非stackoverflow.com設置了一個叫做cors頭的東西,它允許Google.com和Stackoverflow.com之間的通信通過。

根據你的問題......你說你發佈到由Java Spring支持的後端api。這個api需要一個csrf_token,所以它聽起來像是一個只能用於設置該服務的域名的api。例如,用戶轉到google.com併發布POST到www.google.com/url_to_post_to/。谷歌將確保CSRF_Token與此請求一起發送......因爲他們不希望人們隨機訪問此api網址......而沒有有效的Google會話。

+0

謝謝你的解釋。我真正需要知道的是這兩件事,即服務器期望的名稱和實際的令牌。我一直在做進一步的研究,顯然,Spring,默認情況下會使這個令牌對客戶端不可見。因此,看起來如果你不使用他們的技術(JSP),你將需要禁用它。 – Tony