为什么我能够从javascript控制台发送跨域ajax请求

Why am I able to send cross-domain ajax requests from the javascript console?

本文关键字:ajax 请求 控制台 javascript 为什么      更新时间:2023-09-26

为什么当我访问几乎任何网站时,例如SO,如果我打开控制台,注入jQuery并向我在本地主机上运行的服务器发送跨域ajax请求,我不会像预期的那样收到任何错误?但是,如果我打开我自己编写的一个网页,它也在本地主机上运行(但在与服务器使用的端口不同的端口上),如果我试图从控制台发送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

这里发生的事情似乎很明显:浏览器只是以不同于页面本身运行的代码的方式处理控制台中键入的代码。这样做在哲学上是有道理的。毕竟,同源策略的目的是防止XSS和CSRF攻击,如果用户打开控制台并发送跨域请求,他们只是在攻击自己。

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

这被称为CORS请求。

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

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