2012-09-28 54 views
2

如果可能的话,我想在答案中有一个具体的例子。为什么CORS基于目标服务器?为什么我必须使用JSONP?

为了说明起见,我们在这里有三个玩家。

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

我正在做一个Web服务给我的客户,允许他们以JSON格式检索他们的数据。为了让自己的网站工作,他们必须使用标准的XOR解决方法 - 无论是提出请求的服务器端或靠我在这里设置

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

所以问题的两个部分。首先,为什么在myserver.com上设置了原始策略?为什么我的服务器关心它服务的内容是谁?它不应该是myclient.com吗?这里的具体例子会很棒。第二部分,我明白JSONP可以解决这个问题,但是我担心使用它,因为我不了解第一部分的安全含义。如果我可以设置Access-Control-Allow-Origin: *,JSONP有什么意义?

回答

3

很多问题!

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

  2. CORS肯定比JSONP好得多,但它在每个(旧)浏览器中都不被支持。如果你想尽可能地支持,你将需要某种回退。 CORS允许您执行GET以外的请求,这极大地提高了灵活性。

  3. 目标服务器需要允许这个的原因主要是因为在域A上运行的JavaScript不应该能够访问域B.如果域A可以'允许'这意味着您可以创建JavaScript应用程序有权访问任何公共服务器的沙盒。只有域B的所有者可以明确地允许域A的所有者访问他们的内容。

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

可以肯定的是:除非您理解JSONP的安全隐患,否则CORS可能是更安全的选择。

+0

我可以得到一个downvote解释吗? – mrtsherman

+0

尽管它似乎很容易规避XOR限制。如果我只能从myclient.com发出服务器端请求并仍然获取内容,为什么首先要使用它们? – mrtsherman

+0

@mrtsherman:是的,然后它会运行在服务器的“沙盒”中,而不是浏览器。为了得到更好的解释,我可以推荐研究浏览器域沙箱以及为什么它首先存在。 – Evert