2016-05-16 98 views
0

当我去几乎所有的网站,如何,如果我打开控制台,注入jQuery并发送一个跨域ajax请求到我在本地主机上运行的服务器,我没有得到任何错误正如我所预期的那样?但是,如果我打开其中一个自己写的网页,并且它也在我的本地主机上运行(但与服务器使用的端口不同),如果我尝试从控制台发送ajax请求我得到这个消息:为什么我能够从JavaScript控制台发送跨域的Ajax请求?

XMLHttpRequest cannot load https://localhost:10000/. Request header field My-First-Header is not allowed by Access-Control-Allow-Headers in preflight response. 

Ajax请求的样子:

$.ajax({ 
    type: 'POST', 
    url: 'https://localhost:10000', 
    headers: { 
     "My-First-Header":"first value", 
     "My-Second-Header":"second value" 
    } 

}) 

需要明确的是,我的问题不是如何解决这个问题,而是为什么我甚至能够使跨来自大多数其他网站的域名请求(不应该不允许他们?)。这些网站是否设置了自动绕过限制的某种机制?

请求头:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Cookie:csrftoken=lxe5MaAlb9GC5lPGQpXtSj9HvCP0QhCz; PHPSESSID=uta0nlhlh8r1uimdklmt3v3ho1 
Host:localhost:10000 
Referer:http://stackoverflow.com/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36 

响应头:

Content-Length:3 
Content-Type:text/html 
Date:Mon, 16 May 2016 06:29:03 GMT 
Server:TwistedWeb/16.0.0 
+0

开发人员控制台是特殊的;浏览器明白你是代码的来源,因为它是你自己的浏览器,你应该可以做任何你想做的事情。 – Pointy

+0

_why我甚至能够提出跨域请求_....,因为这是xhr所做的。响应是请求的最终状态。我想你误解了请求/回应.....! – Jai

+0

@Pointy但为什么这不工作在我的第一个例子(当我从我自己的网页发送请求)? –

回答

0

它似乎很明显这是怎么回事上:浏览器简单地处理在控制台比页面本身运行的代码输入不同的代码。它的哲学意义在于它会以这种方式工作。毕竟,同源策略的目的是防止XSS和CSRF攻击,如果用户打开控制台并发送跨域请求,他们只是在攻击自己。

另一方面,它可能欺骗用户执行自己的XSS。如果你去Facebook并打开控制台,Facebook的代码会记录一条警告消息,告诉普通用户不要将未知的代码粘贴到控制台中,因为它可能是恶意的。显然这是他们见过的问题。

+0

这就是我的想法,但我仍然不明白为什么它不工作时,我用我自己的网页,我在本地主机上运行它尝试它?也就是说,如果我尝试从控制台发送ajax,我会收到错误消息,您可以在后面看到 –

0

这称为CORS请求。

默认情况下,所有跨域请求都被大多数主流浏览器阻止。 您可以请求跨域的大多数门户服务都会在响应中进行特殊设置。如果你没有在api级别提供这些设置,那么你的API将被阻止,以便跨域请求。

这些响应设置如下: 响应标题需要有访问控制允许来源属性。 访问控制允许来源可以在全局级别为每个API服务指定*。 access-control-allow-origin可以分别指定每个api服务的具体方法名称。

+0

对不起,这并不能真正回答我的问题。我知道什么是CORS请求,并且我知道响应头。然而,我的服务器显然不会发送这些头文件,这就是为什么我想知道为什么它仍然有效。 –