【问题标题】:Why is CORS based on the target server? Why do I have to use JSONP?为什么CORS基于目标服务器?为什么我必须使用 JSONP?
【发布时间】:2012-09-20 10:42:26
【问题描述】:

如果可能的话,我想要一个具体的例子来回答。

为了解释起见,我们这里有三个玩家。

  • 我的服务器 (myserver.com)
  • 客户端服务器 (myclient.com)
  • 客户用户(通过 myclient.com 访问数据)

我正在为我的客户提供一个网络服务,允许他们以 JSON 格式检索他们的数据。为了让他们的网站正常工作,他们必须使用标准的 XOR 变通办法——要么在服务器端发出请求,要么依靠我来设置

Access-Control-Allow-Origin: http://myclient.com

所以这里有两个部分的问题。首先,为什么要在 myserver.com 设置源策略?为什么我的服务器关心它向谁提供内容?不应该是 myclient.com 设置这个吗?这里的具体例子会很棒。

第二部分,我知道 JSONP 可以解决这个问题,但我担心使用它,因为我不了解第一部分的安全含义。如果我可以设置Access-Control-Allow-Origin: *,那么 JSONP 有什么意义?

【问题讨论】:

    标签: jsonp cors


    【解决方案1】:

    很多问题!

    1. 如果您打算提供用户特定的内容,JSONP 绝对是危险的。如果服务器提供的内容是完全公开的,并且(可能)是只读的,那么 JSONP 是一个明智的选择。不要将其用于任何假定“登录状态”或身份验证/授权的情况。

    2. CORS 绝对比 JSONP 好得多,但并非所有(旧版)浏览器都支持它。如果您想尽可能多地支持,您将需要某种回退。 CORS 允许您执行 GET 以外的请求,这极大地提高了灵活性。

    3. 目标服务器需要允许这样做的原因,主要是因为在域 A 上运行的 javascript 应该无法访问域 B。如果域 A 可以“允许”这个,则意味着您可以创建 javascript 应用程序有权访问任何公共服务器的沙箱。只有域 B 的所有者才能明确允许域 A 的所有者访问其内容。

    4. 您的论点(为什么域 B 关心谁访问他们的资源)通常是有效的。但这不是保护域 B,而是保护最终用户。未经明确许可,不应允许域 A 代表最终用户向域 B 执行请求。

    请确定:除非您非常了解 JSONP 的安全含义,否则 CORS 可能是更安全的选择。

    【讨论】:

    • 似乎绕过 XOR 限制真的很容易。如果我可以从 myclient.com 发出服务器端请求并仍然获取内容,为什么还要首先使用它们?
    • @mrtsherman:是的,但它会在服务器的“沙箱”中运行,而不是在浏览器中运行。为了获得更好的解释,我建议只研究浏览器域沙箱及其存在的原因首先。
    • 我也对否决票很好奇 :) 我希望它很清楚并且没有技术错误。过去我确实对这个主题进行了相当多的研究。
    • 是的,绝对清晰且有意义。我将按照建议研究浏览器沙箱及其背后的原因。
    • @Evert 我打算投反对票,因为我在我认为的“目标”服务器和你认为的服务器之间感到困惑。
    猜你喜欢
    • 2012-03-23
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多