为什么我能够从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。如果你去脸书打开控制台,脸书会有代码记录一条警告消息,告诉普通用户不要将未知代码粘贴到控制台中,因为这可能是恶意的。显然,这是他们看到的一个问题。
这被称为CORS请求。
默认情况下,大多数主要浏览器都会阻止所有跨域请求。您可以跨域请求的大多数门户服务都在响应中进行特殊设置。如果你没有在api级别提供这些设置,那么你的api将被阻止用于跨域请求。
这些响应设置如下:响应标头需要具有访问控制允许来源属性。访问控制允许origin可以在全局级别为每个api服务指定*。访问控制允许origin可以分别为每个api服务指定特定的方法名称。。
相关文章:
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- "日期“;AJAX请求返回的类型值未定义
- 在等待ajax请求时显示微调器并禁用页面
- 跨域ajax请求
- Ajax请求返回空的数据字符串,但首先得到了正确的数据
- Javascript-如何让脚本与Ajax请求的数据一起运行
- ajax请求成功,但可以'我看不到我的数据
- 如何将给定的curl命令复制为jquery ajax请求
- 为什么我能够从javascript控制台发送跨域ajax请求
- 一台特定计算机的Ajax请求数据未定义/失败
- 获取ajax请求的请求头
- 原型Ajax请求参数为嵌套json
- 可以't从AJAX请求中筛选数据
- jQuery Mobile Collapse上的AJAX请求
- 暂停函数执行流程,直到ajax请求完成