从Javascript客户端(如客户端浏览器)执行跨域HTTP
请求时。在接收端,是否能够指出Javascript请求的来源?
示例,我有一个网站,它会加载一个可以调用网络服务的Javascript,比如foo.com/someapi
当API收到请求时,它能够获得发起主机的内容。假设我的网站为bar.com
,当我访问bar.com/index.html
时,它会加载页面并启动javascript HTTP请求foo.com/someapi
在客户端请求中,没有服务器端请求涉及其纯Javascript。
此外,如果从开发环境执行调用,如localhost,接收hostname
将获得的foo.com/someapi
会怎样?
从Javascript执行HTTP请求时,浏览器会执行什么操作:
答案 0 :(得分:2)
@Andbdrew提到Origin
标头,它是跨源资源共享(CORS)规范的一部分。这是一个有用的指南,但不一定准确(或始终可用)。
(几乎)100%可靠的唯一信息是请求来自的IP地址(或者更确切地说是传递请求的最近代理服务器的IP地址)。这需要准确,否则响应将无法返回发出请求的计算机。但是,它仅显示客户端的位置,不发出请求的页面的来源。 (无论页面是从文件,本地主机还是外部站点加载,此位置都是相同的)
使用支持CORS的浏览器,假设发生的是:
客户请求来自foo.com的页面
foo.com返回一个页面,包括一些脚本(可能作为外部资源)。
这些脚本的原点设置为foo.com
脚本尝试从bar.com
客户端向bar.com发送请求,并将HTTP Origin标头设置为'foo.com' - 这不是客户端的主机名,但它代表脚本的来源。
bar.com(如果它支持CORS)应该返回带有Access-Control-Allow-Origin标头集(或相关标头)的资源
有几点:
如果客户端不支持CORS,则根本不会发送Origin头。有关浏览器支持列表,请参阅http://caniuse.com/cors。
如果第一个请求不是foo.com,而是file://
网址,则不会发送任何Origin标头。
如果该请求不是file://
网址,而是来自localhost
,则应设置原始网址 。规范中没有任何内容表示没有,但我没有检查浏览器实际执行的操作。
在某些其他情况下,不会发送Origin标头;浏览器扩展程序和(我相信)Chrome应用程序不会发送它。
如果服务器不支持CORS,它将忽略标题,浏览器可能会拒绝响应。
现在,尽管如此,你不能依赖任何这一点。 CORS基本上是一种技术,旨在帮助客户端浏览器保护本身免受其运行的脚本的影响。它不是保护服务器,甚至不让服务器知道谁在访问数据,因为它很容易被伪造。它存在的原因是让“好”的脚本在一个“好”的浏览器中运行一种方式来说明它们是谁 - 一种在同一“好”浏览器中运行的“坏”脚本不应该冒充的方式。 / p>
这绝对不意味着实际控制资源的服务器应该依赖该头来实现任何安全性。如果访问的数据非常重要,则应该有适当的访问控制(https,密码和基于cookie的安全会话是一个很好的组合)
答案 1 :(得分:0)
如果您的网站为bar.com
,则ORIGIN
标题将设置为bar.com
。
您可以在浏览器检查员的NET标签中查看。
编辑:如果您来自开发环境或本地主机,则应设置主机文件(假设为linux / mac)并将local.bar.com设置为127.0.0.1。然后,ORIGIN
标题将设置为local.bar.com。
此标头不应该被误认为是身份验证策略。要尝试限制对授权用户的访问权限,您可以在http://oauth.net/2/
查看OAuth