Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Javascript Http请求的原始主机_Javascript_Ajax_Http - Fatal编程技术网

获取Javascript Http请求的原始主机

获取Javascript Http请求的原始主机,javascript,ajax,http,Javascript,Ajax,Http,当从Javascript客户端执行跨域HTTP请求时,比如JQuery(从客户端浏览器)。在接收端,它能指出Javascript请求来自哪里吗 例如,我有一个站点,它加载了一个Javascript来调用web服务,比如foo.com/someapi 当API收到请求时,它将能够从发起主机获得什么。假设我的站点是bar.com,当我访问bar.com/index.html时,它将加载页面并向foo.com/someapi发出javascript HTTP请求 在客户端请求中,没有涉及纯Javasc

当从Javascript客户端执行跨域
HTTP
请求时,比如JQuery(从客户端浏览器)。在接收端,它能指出Javascript请求来自哪里吗

例如,我有一个站点,它加载了一个Javascript来调用web服务,比如
foo.com/someapi

当API收到请求时,它将能够从发起主机获得什么。假设我的站点是
bar.com
,当我访问
bar.com/index.html
时,它将加载页面并向
foo.com/someapi
发出javascript HTTP请求

在客户端请求中,没有涉及纯Javascript的服务器端请求

此外,如果调用是从开发环境执行的,比如localhost,那么接收
foo.com/someapi
的主机名将是什么

浏览器从Javascript执行HTTP请求时做什么:

  • 在公共域站点中
  • 和本地主机站点

如果您的站点是
bar.com
,则
ORIGIN
标题将设置为
bar.com

您可以在浏览器检查器的“网络”选项卡中查看此信息

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


此标头不应被误认为是身份验证策略。为了尝试限制对授权用户的访问,您可以查看OAuth,网址为

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

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

使用支持CORS的浏览器,应该做到以下几点:

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

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

  • 这些脚本运行时其源代码设置为foo.com

  • 脚本尝试从bar.com请求其他资源

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

  • bar.com(如果它支持CORS)应返回设置了访问控制允许源站标头(或相关标头)的资源

  • 有两点:

  • 如果客户机不支持CORS,那么它将根本不发送原始标头。有关浏览器支持列表,请参见

  • 如果第一个请求不是发送到foo.com,而是发送到
    文件://
    url,则不会发送任何原始标头

  • 如果该请求不是
    文件://
    url,而是来自
    localhost
    ,则应设置原始标头。规范中没有规定不允许,但我还没有检查浏览器的实际功能

  • 在其他一些情况下,将不发送原始标头;浏览器扩展和(我相信)Chrome应用程序不会发送它

  • 如果服务器不支持CORS,那么它将忽略标题,浏览器可能会拒绝响应

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


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

    您如何在服务器端(foo.com)处理HTTP请求?如果它来自一个开发环境,一个本地主机环境,那么我会向foo.com/someapi发出一个HTTP请求。源文件头是CORS的一部分,而不是HTTP规范。如果它支持CORS,并且源文件不是本地文件URL,但您不必依赖它,那么应该由浏览器设置。@iancleland,因此这很容易被伪造。不要如果未设置
    ORIGIN
    ,浏览器不支持CORS,请求也不会被发送,因此您不必担心:)。在这种情况下,您将需要求助于其他技术,如JSONP或使用某种代理。好的,我明白了,无论如何,只是为了添加我尝试的原因要做到这一点,我正在考虑一个网站能够在web服务(外部/其他域)上发布帖子的基本方法,当我单击网站上的“提交”按钮时。而web服务可以识别请求来自何处。