繁体   English   中英

为什么我可以从JavaScript控制台发送跨域Ajax请求?

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

当我进入几乎任何网站(例如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。 如果您访问Facebook并打开控制台,则Facebook的代码会记录一条警告消息,告知普通用户不要将未知代码粘贴到控制台中,因为它可能是恶意的。 显然这是他们所看到的问题。

这称为CORS请求。

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

这些响应设置如下:响应标题需要具有access-control-allow-origin属性。 access-control-allow-origin可以为全局级别的每个api服务指定*。 access-control-allow-origin可以分别为每个api服务指定特定的方法名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM