Javascript csrf同一原产地政策不适用';不能阻止阅读反应? 问题:

Javascript csrf同一原产地政策不适用';不能阻止阅读反应? 问题:,javascript,xmlhttprequest,csrf,Javascript,Xmlhttprequest,Csrf,我在localhost:3000上运行以下代码,在localhost:8020上运行api。如果我访问localhost:3000,则会向localhost:8020/user/refresh发出请求,以使用cookie中的刷新令牌获取新的访问令牌,并使用新的访问令牌进行响应。我现在可以使用获取的访问令牌向localhost发出另一个请求:8020/user/delete 但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口?是因为我允许orig

我在localhost:3000上运行以下代码,在localhost:8020上运行api。如果我访问localhost:3000,则会向localhost:8020/user/refresh发出请求,以使用cookie中的刷新令牌获取新的访问令牌,并使用新的访问令牌进行响应。我现在可以使用获取的访问令牌向localhost发出另一个请求:8020/user/delete

但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口?是因为我允许originlocalhost:3000通过“访问控制允许Origin:localhost:3000”发出跨站点请求吗

如果访问控制允许来源是问题所在,我是否必须使用csrf令牌保护我的api请求,或者是否有其他方法?实现csrf令牌不是问题,但我想知道是否有不同的、可能更小的解决方案

<script>
   function post() {
      var x = new XMLHttpRequest();
      x.open("GET", "http://localhost:8020/user/refresh", true);
      x.withCredentials = true;
      x.setRequestHeader("Content-Type", "application/json");

      x.onreadystatechange = function () {
         if (x.readyState == XMLHttpRequest.DONE) {
            var data = JSON.parse(x.responseText);    
            var x2 = new XMLHttpRequest();
            x2.open("POST", "http://localhost:8020/user/delete", true);
            x2.setRequestHeader("Content-Type", "application/json");
            x2.setRequestHeader("Authorization", `Bearer ${data["data"]["accessToken"]}`);
            x2.onreadystatechange = function () {
               if (x2.readyState == XMLHttpRequest.DONE) {
                  console.log(x2.responseText);
               }
            }
            x2.send(JSON.stringify({user : { "id": "2" }}));
         }
      }
      x.send(null);
   }
</script>

<!DOCTYPE html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   </head>
<body onload="post()">
</body>
</html>

职能职位(){
var x=新的XMLHttpRequest();
x、 打开(“获取”http://localhost:8020/user/refresh“,对);
x、 withCredentials=true;
x、 setRequestHeader(“内容类型”、“应用程序/json”);
x、 onreadystatechange=函数(){
if(x.readyState==XMLHttpRequest.DONE){
var data=JSON.parse(x.responseText);
var x2=新的XMLHttpRequest();
x2.打开(“POST”http://localhost:8020/user/delete“,对);
x2.setRequestHeader(“内容类型”、“应用程序/json”);
x2.setRequestHeader(“授权”,`Bearer${data[“data”][“accessToken”]}`);
x2.onreadystatechange=函数(){
if(x2.readyState==XMLHttpRequest.DONE){
console.log(x2.responseText);
}
}
send(JSON.stringify({user:{“id”:“2”}});
}
}
x、 发送(空);
}
解决方案 但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口?是因为我允许originlocalhost:3000通过“访问控制允许Origin:localhost:3000”发出跨站点请求吗

是,“访问控制允许来源:localhost:3000”允许localhost:3000读取响应

如果访问控制允许来源是问题所在,我是否必须使用csrf令牌保护我的api请求,或者是否有其他方法?实现csrf令牌不是问题,但我想知道是否有不同的、可能更小的解决方案

<script>
   function post() {
      var x = new XMLHttpRequest();
      x.open("GET", "http://localhost:8020/user/refresh", true);
      x.withCredentials = true;
      x.setRequestHeader("Content-Type", "application/json");

      x.onreadystatechange = function () {
         if (x.readyState == XMLHttpRequest.DONE) {
            var data = JSON.parse(x.responseText);    
            var x2 = new XMLHttpRequest();
            x2.open("POST", "http://localhost:8020/user/delete", true);
            x2.setRequestHeader("Content-Type", "application/json");
            x2.setRequestHeader("Authorization", `Bearer ${data["data"]["accessToken"]}`);
            x2.onreadystatechange = function () {
               if (x2.readyState == XMLHttpRequest.DONE) {
                  console.log(x2.responseText);
               }
            }
            x2.send(JSON.stringify({user : { "id": "2" }}));
         }
      }
      x.send(null);
   }
</script>

<!DOCTYPE html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   </head>
<body onload="post()">
</body>
</html>
OWASP建议始终使用csrf令牌。所以我实现了csrf令牌

但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口

默认情况下,是的

是因为我允许originlocalhost:3000通过“访问控制允许Origin:localhost:3000”发出跨站点请求吗

对。显式授予localhost:3000读取数据的权限可以让localhost:3000读取数据

如果访问控制允许来源是问题所在,我是否必须使用csrf令牌保护我的api请求,或者是否有其他方法

您使用什么方法来保护端点不受攻击者攻击在很大程度上取决于:

  • 你想让谁停止做坏事
  • 你想让那些人做什么
  • 你想让别人做什么

我希望您也在服务器上进行真正的授权。CSRF令牌并不授权任何操作,它仅用于检查请求是否来自您自己域的源。@Teemu我已设置JWT访问和刷新令牌。听起来我必须使用csrf令牌来检查源代码。如果我必须允许多个网站向我的API发出请求。然后我必须允许所有来源,接下来,攻击者可以看到响应。因此,除了使用csrf令牌检查源代码之外,没有其他方法可以保护我的API不受csrf的影响。你能确认这一点吗?“那么我必须允许所有来源”-不,只有那些你想允许访问的。建议将源标头检查为二级保护,并始终实施csrf令牌。我想我会使用csrf令牌并检查源标题。