javascript - 如何使用 XMLHTTPRequest 处理 CSRF token ?

标签 javascript xmlhttprequest csrf

我正在使用受 CSRF 保护的 API。所以我需要调用 get 来获取 CSRF token ,然后传递相同的 token 来执行 POST 调用。

以下是我尝试过的方法,但我总是收到 CSRF token 验证失败作为对 POST 调用的响应。

var tryout = new XMLHttpRequest();
tryout.open("GET", "/api/1.0/csrf");
tryout.withCredentials = true;
tryout.setRequestHeader("x-csrf-token", "fetch");    
tryout.setRequestHeader("Accept", "application/json");
tryout.setRequestHeader("Content-Type", "application/json; charset=utf-8");
tryout.onreadystatechange = function () {
    console.log(this);
    var csrfToken = this.getResponseHeader('x-csrf-token');
    if(tryout.readyState == 4){
        console.log(csrfToken);
        tryout.open('POST', '/api/1.0/create');
        tryout.setRequestHeader('x-csrf-token', this.getResponseHeader('x-csrf-token'));            
        tryout.onreadystatechange = function () {
            console.log("call 2");
            console.log(this.responseText);
        };
        tryout.send();
    }
};
tryout.send();

我怀疑可能是 POST 调用正在启动新 session ,因此 CSRF 对该 session 无效。

请指导我如何在同一 session 中执行两个 xhr 调用?

最佳答案

我尝试使用 XMLHTTPRequest 对两个调用使用相同的 xhr 对象进行同步调用(获取 csrf token 和下一个 http post 调用在 header 中传递 csrf token 并且它有效。下面是示例代码。

var res = null;
var tryout = new XMLHttpRequest();  
tryout.open("GET", "/odata/1.0/service.svc", false);
tryout.withCredentials = true;
tryout.setRequestHeader("x-csrf-token", "fetch");    
tryout.setRequestHeader("Accept", "application/json");
tryout.setRequestHeader("Content-Type", "application/json; charset=utf-8");
tryout.send(null);

if(tryout.readyState === 4){
  var csrfToken = tryout.getResponseHeader('x-csrf-token');   

  tryout.open('POST', '/odata/1.0/service.svc/Clients', false);
  tryout.setRequestHeader('x-csrf-token', csrfToken);       
  tryout.setRequestHeader("Content-Type", "application/json; charset=utf-8");
  tryout.setRequestHeader("Accept", "application/json");

  tryout.send(JSON.stringify(obj));

  if(tryout.readyState === 4){
      res = JSON.parse(this.responseText);
  }
}

关于javascript - 如何使用 XMLHTTPRequest 处理 CSRF token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48659892/

相关文章:

javascript - 如何使用 Javascript 和 XMLHttpRequest 加载二进制图像数据?

php - admin内页使用CSRF重要吗?

javascript - 处理基于触摸的事件

javascript - Ext JS 6 从 Ext JS 4.1.3 迁移

javascript - ionic 框架 $state.go ('app.home' );在我想去的页面上添加后退按钮(如何删除它)?

php - Laravel 419 页面在生产服务器上已过期。 [框架: Laravel | version : 7. 5.2]

security - 防止 Spring WebFlow 应用程序中的跨站点请求伪造

javascript - 检查长度为 5 的子字符串是否在另一个字符串中(重构)

jquery - 如何将 withCredentials=true 添加到 Jquery .load() 中?

javascript - XMLHttpRequest:如何强制缓存?