8

鉴于编写跨域获取数据的服务器端代理的简单性,我不知道阻止客户端 AJAX 跨域进行调用的最初意图是什么。我不是在要求猜测,我是在寻找语言设计者(或与他们关系密切的人)的文档,以了解他们认为自己在做什么,而不是仅仅给开发人员带来轻微的不便。

TIA

4

5 回答 5

6

这是为了防止浏览器充当反向代理。假设您正在办公室的 PC 上浏览http://www.evil.com,并假设在该办公室存在一个包含敏感信息的内部网http://intranet.company.com,只能从本地网络访问. 如果跨域策略不存在,www.evil.com 可以向http://intranet.company.com发出 ajax 请求,使用您的浏览器作为反向代理,并将该信息与另一个发送到 www.evil.com阿贾克斯请求。

我猜这是限制的原因之一。

于 2012-05-30T17:33:39.410 回答
2

此限制的最重要原因是安全问题:JSON 请求是否应该让浏览器服务并接受 cookie 或安全凭证以及对另一个域的请求?这与服务器端代理无关,因为它无法直接访问客户端环境。有一个关于安全净化 JSON 特定请求方法的提案,但它还没有在任何地方实现。

于 2012-05-30T17:10:24.650 回答
2

如果您是 myblog.com 的作者并且您对 facebook.com 进行了 XHR,那么该请求是否应该发送您的 facebook cookie 凭据?不,这意味着您可以从您的博客请求用户的私人 Facebook 信息。

如果您创建代理服务来执行此操作,则您的代理无法访问 facebook cookie。

您可能还会质疑为什么 JSONP 可以。原因是您正在加载一个不是您编写的脚本,因此除非 facebook 的脚本决定从他们的 JS 代码中向您发送信息,否则您将无法访问它

于 2012-05-30T17:14:16.213 回答
1

直接访问和代理之间的区别在于 cookie 和其他安全相关的识别/验证信息,它们绝对限于一个来源。

有了这些,您的浏览器可以访问敏感数据。您的代理不会,因为它不知道用户的登录数据。

因此,代理仅适用于公共数据;和CORS一样。

于 2012-05-30T17:20:01.070 回答
1

我知道您在寻求专家的答案,我只是一个新手,这就是我对为什么服务器端代理不是正确的最终解决方案的看法:

  • 构建服务器端代理并不像根本不构建它那么容易。
  • 并非总是像在第三方 JS 小部件中那样可行。您不会要求所有发布者声明 DNS 注册以集成您的小部件。document.domain并用附带问题修改他的页面。
  • 正如我在《第三方 Javascript 》一书中读到的“它需要加载一个中间隧道文件才能发出跨域请求”。至少你把 JSONP 放到了游戏中,更棘手的是杂耍。
  • IE8 不支持,同样来自上述书籍:“IE8 有一个相当奇怪的错误,即使顶级域都选择进入公共域命名空间,它也会阻止顶级域与其子域通信”
  • 正如人们在其他答案中解释的那样,有几个安全问题,甚至更多,您可以查看上述书籍的第4.3.2 章使用子域代理进行消息交换。

对我来说最重要的是:

  • 这是一个 hack.. 就像 JSONP 解决方案一样,是时候采用标准、可靠、安全、干净和舒适的解决方案了。

但是,重新阅读您的问题后,我想我仍然没有回答,那么为什么要使用 AJAX 安全性?,我再次认为,答案是:

因为您不希望您访问的任何网页能够从您的桌面呼叫任何计算机或服务器到您办公室的 Intranet

于 2012-05-30T17:53:40.833 回答