本文摘自PHP中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于CORS跨域资源共享详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
了解下同源策略
源(origin)*:就是协议、域名和端口号;同源: 就是源相同,即协议、域名和端口完全相同;同源策略:同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源;
同源策略的分类:
DOM 同源策略:即针对于DOM,禁止对不同源页面的DOM进行操作;如不同域名的 iframe 是限制互相访问。XMLHttpRequest 同源策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。
不受同源策略限制:
页面中的链接,重定向以及表单提交(因为表单提交,数据提交到action域后,本身页面就和其没有关系了,不会管请求结果,后面操作都交给了action里面的域)是不会受到同源策略限制的。资源的引入不受限制,但是js不能读写加载的内容:如嵌入到页面中的<script src="..."></script>,<img>,<link>,<iframe>等
为什么要跨域限制
如果没有 DOM 同源策略:那么就没有啥xss的研究了,因为你的网站将不是你的网站,而是大家的,谁都可以写个代码操作你的网站界面
如果没有XMLHttpRequest 同源策略,那么就可以很轻易的进行CSRF(跨站请求伪造)攻击:
用户登录了自己的网站页面 a.com,cookie中添加了用户标识。用户浏览了恶意页面 b.com,执行了页面中的恶意 AJAX 请求代码。b.com 向 a.com发起 AJAX HTTP 请求,请求会默认把 a.com对应cookie也同时发送过去。a.com从发送的 cookie 中提取用户标识,验证用户无误,response 中返回请求数据;数据就泄露了。而且由于Ajax在后台执行,这一过程用户是无法感知的。(附)有了XMLHttpRequest 同源策略就可以限制CSRF攻击?别忘了还有不受同源策略的:表单提交和资源引入,(安全问题下期在研究)
跨域决解方案
JSONP 跨域:借鉴于 script 标签不受浏览器同源策略的影响,允许跨域引用资源;因此可以通过动态创建 script 标签,然后利用 src 属性进行跨域;
缺点:所有网站都可以拿到数据,存在安全性问题,需要网站双方商议基础token的身份验证。只能是GET,不能POST。可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题。服务器代理:浏览器有跨域限制,但是服务器不存在跨域问题,所以可以由服务器请求所要域的资源再返回给客户端。document.domain、window.name 、location.hash:借助于iframe决解DOM同源策略postMessage:决解DOM同源策略,新方案CORS(跨域资源共享):这里讲的重点
CORS(跨域资源共享)
HTML5 提供的标准跨域解决方案,是一个由浏览器共同遵循的一套控制策略,通过HTTP的Header来进行交互;主要通过后端来设置CORS配置项。
CORS简单使用
之前说得CORS跨域,嗯嗯,后端设置Access-Control-Allow-Origin:*|[或具体的域名]就好了;第一次尝试:
1 2 3 4 |
|
发现有些请求可以成功,但是有些还是会报错:
并且发现发送的是OPTIONS请求:
发现:CORS规范将请求分为两种类型,一种是简单请求,另外一种是带预检的非简单请求
简单请求和非简单请求
浏览器发送跨域请求判断方式:
浏览器在发送跨域请求的时候,会先判断下是简单请求还是非简单请求,如果是简单请求,就先执行服务端程序,然后浏览器才会判断是否跨域;而对于非简单请求,浏览器会在发送实际请求之前先发送一个OPTIONS的HTTP请求来判断服务器是否能接受该跨域请求;如果不能接受的话,浏览器会直接阻止接下来实际请求的发生。什么是简单请求
请求方法是如下之一:
GETHEADPOST
所有的Header都只包含如下列表中(没有自定义header):
Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma除此之外都是非简单请求
CORS非简单请求配置须知
正如上图报错显示,对于非简单请求,浏览器会先发送options预检,预检通过后才会发送真是的请求;发送options预检请求将关于接下来的真实请求的信息给服务器:
1 2 3 |
|
1 2 3 4 5 |
|
CORS完整配置
koa配置CORS跨域资源共享中间件:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
现在不管是简单请求还是非简单请求都可以跨域访问啦~
跨域时如何处理cookie
cookie:
我们知道http时无状态的,所以在维持用户状态时,我们一般会使用cookie;cookie每次同源请求都会携带;但是跨域时cookie是不会进行携带发送的;
问题:
由于cookie对于不同源是不能进行操作的;这就导致,服务器无法进行cookie设置,浏览器也没法携带给服务器(场景:用户登录进行登录操作后,发现响应中有set-cookie但是,浏览器cookie并没有相应的cookie)
决解:
浏览器请求设置withCredentials为true即可让该跨域请求携带 Cookie;使用axios配置axios.defaults.withCredentials = true服务器设置Access-Control-Allow-Credentials=true允许跨域请求携带 Cookie“积跬步、行千里”―― 持续更新中~,喜欢的话留下个赞和关注哦!
往期经典好文:
服务器(CentOS)安装配置mongodbKoa日志中间件封装开发(log4js)团队合作必备的Git操作使用pm2部署node生产环境
以上就是CORS跨域资源共享详细介绍(附代码)的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
html5中关于div与span html块级元素的详细介绍
html5多线程javascript解决方案web worker-专用worker和共享worker的详细代码介绍
更多相关阅读请进入《koa》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者