2017-01-03 55 views
1

我在expressjs中使用csurf模塊。它適用於所有發佈請求,因爲我按以下方式使用它。如何在expressjs中的AJAX請求(無Jquery)中發送csrf標記?

app.use(csrf()); 
res.locals.csrfToken = req.csrfToken(); 

這樣它的自動可用在所有形式,我有以下。

<input type="hidden" name="_csrf" value="<%=csrfToken%>"> 

,但我怎麼設置AJAX請求csrftoken,我不使用jQuery,下面是JS函數來發送Ajax請求。我確實在html上提供了csrf標記作爲隱藏值,我可以通過getElementByID訪問它。

注:我可以,如果我禁用CSRF發送請求。

function voteQuestion() { 
    var qid = document.getElementById("qid").value; 
    var csrf = document.getElementById("csrf").value; 
    var http = new XMLHttpRequest(); 
    var url = "https://stackoverflow.com/q/ajaxcall"; 
    var params = "qid="+ qid; 
    http.open("POST", url); 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.onreadystatechange = function() { 
    if(http.readyState == XMLHttpRequest.DONE && http.status == 200) { 
     var json = (http.responseText); 
     var obj = JSON.parse(json); 

     document.getElementById("vote-sp").innerHTML = (obj.upvotes); 
    } 
}; 
http.send(params); 

}

+0

您可以使用FormData()對象通過CsrfToken發送完整的表單數據。 –

回答

0

我一直想弄明白這一點,現在已經差不多一個星期了,只是決定console.log req.session,發現cookies包含「XSRF-TOKEN」值,所以在AJAX請求頭中,我將XSRF-TOKEN設置爲csrf現在它的工作原理,我不知道爲什麼它這種方式特別適用於AJAX請求。

setRequestHeader("XSRF-TOKEN", csrf); 
0

crsf令牌位於params如下..

var params = "qid="+ qid + "&crsf="+csrf; 

OR

您可以創建如下發送數據的新對象..

var data = {}; //crates new object 
data.qid = qis; //adds qid to object 
data.csrf = csrf; //adds qid to object 

params = data; // to server 
+0

都嘗試過,仍然得到ForbiddenError:無效的csrf標記。我也嘗試過「&_csrf」,因爲csurf使用它作爲名稱值,仍然不起作用。加上試過的setRequestHeader('X-CSRF-Token',csrf),這也行不通。 – user856984

+0

使用'$ _POST ['csrf'];' –

+0

檢查服務器文件中的值我無法發送請求,所以我無法檢查它。我正在使用express並在我的router.post(「/ q/ajaxcall」)上有一個console.log,並且該請求甚至在該點之前都沒有。 – user856984