当前位置:网站首页>Web安全(二)---跨域资源共享
Web安全(二)---跨域资源共享
2020-11-07 20:56:00 【Coxhuang】
文章目录
- 跨域资源共享(CORS)
- #1 什么是CORS
- #2 两种请求
- #3 请求过程
- #3.1 简单请求
- #3.2 复杂请求
跨域资源共享(CORS)
#1 什么是CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
#2 两种请求
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
- 简单请求
只要同时满足以下两大条件,就属于简单请求。
- 请求方法是以下三种方法之一:
- HEAD
- GET
- POST
- HTTP的头信息不超出以下几种字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不同时满足上面两个条件,就属于非简单请求。
2. 复杂请求
不满足上面简单的,都属于复杂请求
#3 请求过程
#3.1 简单请求
当浏览器发现跨域的Ajax请求时简单请求,会走如下流程 :
- 浏览器 : 兄弟,你这是需要跨域请求吧 ! 得问一下服务器大哥同不同意吧, 我在你的header里加上Origin信息, 让服务器大哥知道你是哪来的
- 服务器 : 来者何人,亮出你的Origin给我瞧瞧(服务器大哥拿着Origin和自己手上的Origin比较),在我的允许范围内,允许进入服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKvZLMX8-1584912081477)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20200323031039.png)]
服务器配置CORS
//指定允许其他域名访问 'Access-Control-Allow-Origin:http://admin.minhung.me:19700'//一般用法(*,指定域,动态设置),3是因为*不允许携带认证头和cookies //是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回 'Access-Control-Allow-Credentials:true'
Access-Control-Allow-Origin有多种设置方法 :
- 设置是最简单粗暴的,但是服务器出于安全考虑,肯定不会这么干,而且,如果是的话,游览器将不会发送cookies,即使你的XHR设置了withCredentials
- 动态设置为请求域,多人协作时,多个前端对接一个后端,这样很方便
#3.2 复杂请求
最常见的情况为,当我们使用PUT
或者DELETE
请求时,浏览器会先发送option
(预检)请求
与简单请求不同的是,option请求多了2个字段:
- Access-Control-Request-Method:该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法。
- Access-Control-Request-Headers:该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段
Access-Control-Request-Method,Access-Control-Request-Headers返回的是满足服务器要求的所有请求方式,请求头,不限于该次请求,服务器收到"预检"请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。
HTTP/1.1 200 OK Access-Control-Allow-Origin: http://api.minhung.me:19800 Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain
上面的HTTP回应中,关键的是Access-Control-Allow-Origin字段,表示http://api.minhung.me:19800可以请求数据。该字段也可以设为星号,表示同意任意跨源请求。
如果浏览器否定了"预检"请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误,被XMLHttpRequest对象的onerror回调函数捕获。控制台会打印出如下的报错信息。
一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
版权声明
本文为[Coxhuang]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1744585
边栏推荐
- Andque.
- static+代码块+多态+异常
- 屏读时代,我们患上了注意力缺失候群症
- 技术总监7年自述——如何选择一家好公司
- 模型预测准确率高达94%!利用机器学习完美解决2000亿美元库存难题
- 从技术谈到管理,把系统优化的技术用到企业管理
- Technical debt is a lack of real understanding of business functions- daverupert.com
- [漫谈] 软件设计的目标和途径
- How did I lose control of the team?
- Practice of Xiaoxiong school development board: real equipment access of smart street lamp sandbox experiment
猜你喜欢
来自不同行业领域的50多个对象检测数据集
Web API series (3) unified exception handling
30岁后,你还剩下什么?
全网最硬核讲解计算机启动流程
我们为什么需要软件工程——从一个简单的项目进行观察
The CPU does this without the memory
盘点那些争议最大的编程观点,你是什么看法呢?
统计文本中字母的频次(不区分大小写)
Why do we need software engineering -- looking at a simple project
Git代码提交操作,以及git push提示failed to push some refs'XXX'
随机推荐
[漫谈] 软件设计的目标和途径
工作1-3年的程序员,应该具备怎么样的技术能力?该如何提升?
awk实现类sql的join操作
小熊派开发板实践:智慧路灯沙箱实验之真实设备接入
Insight -- the application of sanet in arbitrary style transfer
GrowingIO 响应式编程探索和实践
Deep into web workers (1)
[random talk] the goal and way of software design
京淘项目day09
What kind of technical ability should a programmer who has worked for 1-3 years? How to improve?
【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
CPU瞒着内存竟干出这种事
Exception calling 'downloadstring' with '1' arguments: 'operation timed out'
How to learn technology efficiently
DOM节点操作
DOM node operation
AFO记
微服务的出现和意义的探索
如何以计算机的方式去思考
Git code submission operation, and git push prompt failed to push some refs'xxx '