gpt4 book ai didi

cors - 获取API;如果响应是不透明的,为什么要使用 "no-cors"模式?

转载 作者:行者123 更新时间:2023-12-01 06:08:58 25 4
gpt4 key购买 nike

我读了 this questionthis question .前者只解释了“no-cors”与“same-origin”;后者建议 'no-cors' 没有用,因为不透明响应(Javascript 无法读取/执行任何有用的操作):

You basically never ever want to use mode: 'no-cors' in practice — except in some very limited cases. That’s because what setting mode: 'no-cors' actually says to the browser is, “Block my frontend JavaScript code from looking into the contents of the response body and headers under all circumstances.” In most cases that’s obviously really not what you want.



有人可以建议 这些“有限情况”的示例是什么,我们希望使用“无cors”(即使响应是不透明的?)

我能想到的唯一情况是一种单向通信;如果客户端向服务器发送 GET 或 POST 就足够了,那么服务器就可以跟踪请求的发生; (例如,增加请求计数器); ...

...那么响应是一个 OpaqueResponse 就足够了;即客户端只需要知道请求是否成功(状态 200),不需要任何负载响应。

我的想法是一个有效的例子吗?有人可以推荐其他可能性/用例/'no-cors'用法的例子吗?

最佳答案

请记住,CORS 设置不会阻止请求到达服务器 - 这就是身份验证和 CSRF 的用途。相反,它会阻止页面读取响应。请求仍然是:

  • 从页面发送,
  • 浏览器添加 Origin标题,
  • 它仍然由服务器处理(通常 - CORS 与此无关,尽管可能还有其他安全措施),
  • 当返回时,浏览器会检查 Access-Control-Allow-Origin 的响应 header .如果它匹配浏览器认为是 Origin然后浏览器让页面看到请求的结果。

  • 这就是关键 - 同源策略和 CORS 设置不允许协作浏览器中的页面看到响应 .

    还要注意上面还有一个步骤 0,它是一个 OPTIONS“飞行前检查”,用于检查请求是否通过,是否允许页面查看结果?如果没有,那么他们认为发送请求没有意义 - 但这是一个假设。

    现在来回答这个问题
    mode: no-cors做两件事:
  • 它说我不需要看到结果
  • 所以它不会发送飞行前检查

  • 在我的脑海里,这就是我认为我可以用它来做的事情(其中一些是邪恶的)
  • 在我不需要看到响应的任何时候,例如日志记录、跟踪或黑客攻击;当前端代码本质上是一个 try { const notNeeded = fetch(...) } catch { console.log('Tough luck, do nothing') }
  • 任何时候我想通过不发送预检检查来尽快将数据发送到服务器。我总是可以稍后发送带有 CORS 的 GET 以在我真正需要它时读取数据。
  • Caching, detailed in this answer

  • 提醒

    CORS 执行上述操作。它不执行以下操作:
  • 阻止服务器处理请求 - 这就是身份验证和 CSRF 预防的目的。
  • 停止欺骗 Origin header - 这仅适用于合作浏览器。作为攻击者,您通常无法访问用户使用的浏览器。因为 header 可以被欺骗,服务器不应该使用其中的数据来保证安全。 (这就是为什么当通过 CURL/Postman/Insomnia 之类的工具测试浏览器 API 时,您需要检查 CORS header 是否通过,因为它们接受所有响应并且从不应用 CORS 策略。)
  • 关于cors - 获取API;如果响应是不透明的,为什么要使用 "no-cors"模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52569895/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com