【问题标题】:How to send csrf token in AJAX request (Without Jquery) in expressjs?如何在expressjs中的AJAX请求(没有Jquery)中发送csrf令牌?
【发布时间】:2017-05-17 03:35:08
【问题描述】:

我在 expressjs 中使用 csurf 模块。它适用于所有发布请求,因为我使用以下方式。

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

通过这种方式,它会自动以我拥有以下内容的所有形式提供。

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

但是如何在 AJAX 请求上设置 csrftoken,我没有使用 jquery,下面是发送 AJAX 请求的 JS 函数。我确实有 html 上的 csrf 令牌作为我可以通过 getElementByID 访问的隐藏值。

注意:如果我禁用 csrf,我可以发送请求。

function voteQuestion () {
    var qid = document.getElementById("qid").value;
    var csrf = document.getElementById("csrf").value;
    var http = new XMLHttpRequest();
    var url = "/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);

}

【问题讨论】:

  • 您可以使用FormData() 对象通过CsrfToken 发送完整的表单数据。

标签: javascript ajax node.js express csrf-protection


【解决方案1】:

我已经尝试解决这个问题将近一周了,只是决定 console.log req.session 并发现 cookie 包含“XSRF-TOKEN”值,所以在 AJAX 请求标头中我将 XSRF-TOKEN 设置为csrf 现在它可以工作了,我不知道为什么它特别适用于 AJAX 请求。

setRequestHeader("XSRF-TOKEN", csrf);

【讨论】:

    【解决方案2】:

    在您的params 中设置crsf 令牌,如下所示..

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

    您可以创建一个用于发送数据的新对象,如下所示..

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

    【讨论】:

    • 两者都试过了,仍然得到 ForbiddenError: invalid csrf token。我还尝试了“&_csrf”,因为 csurf 使用它作为它的名称值,但仍然无法正常工作。加上试过setRequestHeader('X-CSRF-Token', csrf),这也行不通。
    • 使用$_POST['csrf'];检查服务器文件中的值
    • 我无法发送请求,所以无法查看。我正在使用 express 并且在我的 router.post("/q/ajaxcall") 上有一个 console.log ,并且直到那时请求才得到。
    猜你喜欢
    • 2018-06-09
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2018-01-10
    • 2016-06-22
    • 2020-01-25
    相关资源
    最近更新 更多