2

When doing a cross domain HTTP request from a Javascript client, like JQuery (from a client browser). In the receiving end, will it be able to point out where the Javascript request came from?

Example, I have a site, and it loads up a Javascript that will call a web service, say foo.com/someapi

When the API receives the request, what will it be able to get the origination host. Say my site is bar.com and when I access bar.com/index.html it will load up the page and fire up the javascript HTTP request to foo.com/someapi

In the client request there was no server side request involved its pure Javascript.

Furthermore, what if the call is executed from a development environment, like localhost what will be the hostname that the receiving foo.com/someapi will get?

What does a browser do when doing HTTP request from Javascript:

  • In a public domain site
  • And with a localhost site
4

2 回答 2

2

@Andbdrew 提到了Origin标头,它是跨域资源共享 (CORS) 规范的一部分。这是一个有用的指南,但不一定准确(或始终可用)。

唯一(几乎)100% 可靠的信息是请求来自的 IP 地址(或者,更确切地说是中继请求的最近代理服务器的 IP 地址)。这需要准确,否则响应将不会返回到发出请求的计算机。但是,它只显示客户端的位置,而不是发出请求的页面的来源。(无论页面是从文件、本地主机还是外部站点加载的,这个位置都是一样的)

使用支持 CORS 的浏览器,应该发生的是:

  1. 客户从 foo.com 请求一个页面

  2. foo.com 返回一个页面,包括一些脚本(可能作为外部资源)。

  3. 这些脚本运行时将它们的来源设置为 foo.com

  4. 脚本尝试从 bar.com 请求另一个资源

  5. 客户端向 bar.com 发送请求,并将 HTTP Origin 标头设置为“foo.com”——这不是客户端的主机名,但它表示脚本的来源。

  6. bar.com(如果它支持 CORS)应该返回带有 Access-Control-Allow-Origin 标头集(或相关标头)的资源

几点:

  1. 如果客户端不支持 CORS,那么它根本不会发送 Origin 标头。有关浏览器支持矩阵,请参阅http://caniuse.com/cors 。

  2. 如果第一个请求不是发往 foo.com,而是发往file://url,则不会发送 Origin 标头。

  3. 如果该请求不是file://url,而是来自,则应localhost设置Origin 标头。规范中没有任何内容说不,但我还没有检查浏览器实际上做了什么。

  4. 还有一些其他情况下不会发送 Origin 标头;浏览器扩展和(我相信)Chrome 应用程序不会发送它。

  5. 如果服务器不支持 CORS,那么它将忽略标头,并且浏览器可能会拒绝响应。

现在,说了这么多,你不能依赖任何这些。CORS 从根本上说是一种旨在帮助客户端浏览器保护自己免受其运行的脚本的技术。这与保护服务器无关,甚至不是让服务器知道谁在访问数据,因为它很容易被伪造。它存在的原因是为在“好”浏览器中运行的“好”脚本提供了一种说明它们是谁的方式——一种在同一个“好”浏览器中运行的“坏”脚本不应该能够模仿的方式。

这绝对不意味着实际控制资源的服务器应该依赖该标头来获得任何类型的安全性。如果被访问的数据真的很重要,则应该对其进行适当的访问控制(https、密码和基于 cookie 的安全会话是一个很好的组合)

于 2013-04-21T02:50:42.950 回答
0

如果您的网站是bar.comORIGIN标题将设置为bar.com.

您可以在浏览器检查器的 NET 选项卡中查看这一点。

编辑:如果您来自您的开发环境或本地主机,您应该设置您的主机文件(假设 linux / mac)并将 local.bar.com 别名设置为 127.0.0.1。然后,ORIGIN标头将设置为 local.bar.com。

不应将此标头误认为是身份验证策略。要尝试限制对授权用户的访问,您可以在http://oauth.net/2/上查看 OAuth

于 2013-04-21T02:34:19.423 回答