当前位置: 首页 > 知识库问答 >
问题:

CSRF主域同源策略不阻止读取响应?

傅宏恺
2023-03-14

我有以下代码运行在localhost:3000和我的api运行在localhost:8020。如果我访问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>

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

是,"访问-控制-允许-起源:localhost:3000"允许localhost:3000读取响应。

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

OWASP建议始终使用csrf令牌。所以我实现了csrf令牌。

共有1个答案

杨晓博
2023-03-14

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

默认情况下,是的。

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

是的。显式地授予localhost:3000读取数据的权限,localhost:3000读取数据。

如果出现了访问控制允许起源的问题,我是否必须使用csrf令牌来保护我的api请求,或者还有其他方法吗?

保护终端免受攻击者攻击的方法在很大程度上取决于:

  • 你想让谁停止做坏事
  • 你想让这些人做什么
  • 你想让别人做什么
 类似资料:
  • 问题内容: 这是我的代码: 这适用于GET请求而不是POST! 我将Apache用作服务器,并使用以下命令对其进行了配置: 在我的angularjs中,我包含在模块应用程序的配置中: 但是请求POST仍然无法正常工作! 我希望有人能提出任何想法。 问题答案: 在服务器端添加这些标头: 如果仍然无法正常工作,请发布浏览器正在发送的预检请求的详细信息。 为什么要这样做? 如果不是简单的请求(例如,表单

  • 问题内容: 我正在编写一个简单的网站,该网站以一个成语作为输入,并从牛津词典返回其含义和示例。这是我的主意: 我向以下网址发送了请求: 例如,如果习惯用法是“不走远”,我将请求发送至: 然后将我重定向到以下页面: 在此页面上,我可以提取成语的含义和示例。这是我的测试代码。它将提醒响应URL: 问题是我有一个错误: 跨域请求被阻止:“同源起源”策略不允许读取http://www.oxfordlear

  • 问题内容: 我正在网站上使用,最近我的用户在接收邮件时遇到了这个问题。在FireBug中检查后,我意识到脚本失败是由于CORS保护(由于以下错误)所致。 跨域请求被阻止:“同源起源”策略不允许读取http://x3.chatforyoursite.com/subscribe/上的远程资源 。可以通过将资源移到同一域或启用CORS来解决此问题。 现在,我想知道应该在哪里启用CORS,因为在我自己的服

  • 首先,我假设一个后端来控制输入以防止XSS漏洞。 在这个回答中@Les Hazlewood解释了如何在客户端保护JWT。 假设所有通信都使用100%TLS,无论是在登录期间还是登录后的所有时间,通过基本身份验证使用用户名/密码进行身份验证并接收JWT作为交换是一个有效的用例。这几乎就是OAuth 2的一个流(“密码授权”)的工作原理。[...] 您只需设置授权头: 但是,也就是说,如果您的REST

  • 假设我拥有2个域www.xyz.comajax.xyz.com.我想从前缀为www的站点加载我的超文本标记语言和javascript,然后向前缀为ajax的站点执行ajax请求。同源策略会阻止我的ajax请求从www.xyz.comajax.xyz.com还是在不使用访问控制允许源标头的情况下工作。 问候

  • 问题内容: 当人们开始订购过程时,在我的网站https://www.stubwire.com上,我正在从https://files.stubwire.com加载CSS文件。问题是CSS文件正在尝试加载给出错误的字体。有人可以帮我展示如何解决此问题吗?我已经看到有关使用Amazon S3的修复程序,但这是从我们自己的服务器加载的。 错误 跨域资源共享策略已阻止从源“ https://files.st