为什么我去几乎任何网站,例如SO,如果我打开控制台,注入jQuery并向我在localhost上运行的服务器发送跨域ajax请求,我没有得到任何网站像我预期的错误?但是,如果我打开我自己编写的一个网页,并且也在我的localhost上运行(但是在与服务器使用的端口不同的端口上),如果我尝试从控制台发送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 :(得分:0)
这里显而易见的是:浏览器只是处理控制台中输入的代码而不是页面本身运行的代码。它具有哲学意义,它会以这种方式运作。毕竟,同源策略的目的是防止XSS和CSRF攻击,如果用户打开他们的控制台并发送跨域请求,他们只是在攻击自己。
另一方面, 可能会欺骗用户自己执行XSS。如果你去Facebook并打开控制台,Facebook的代码会记录一条警告信息,告诉普通用户不要将未知代码粘贴到控制台,因为它可能是恶意的。显然这是他们见过的问题。
答案 1 :(得分:0)
这被称为CORS请求。
默认情况下,大多数主流浏览器都会阻止所有跨域请求。 您能够跨域请求的大多数门户服务都在响应中进行特殊设置。如果您未在api级别提供这些设置,那么您的api将被阻止以进行跨域请求。
这些响应设置如下: 响应标头需要具有 access-control-allow-origin 属性。 access-control-allow-origin可以为全局级别的每个api服务指定*。 access-control-allow-origin可以单独为每个api服务指定特定的方法名称。