跨域
同源策略
源:源由协议,域名和端口号组成,若url地址的协议、域名和端口号均相同则属于同源。
同源策略:浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对象自资源。其阻止的是数据的接受而不是请求的发送
不受同源策略限制:
页面中的链接,重定向以及表单提交;
可以引入跨域资源,但js不能读写加载内容。 如嵌入到页面中的<script src="..."></script>
,<img>
,<link>
,<iframe>
等。
跨域:受同源策略的限制,不同源的脚本不能操作其他源下面的对象,想操作另一个源下面的对象就是跨域。
实现方式:
- document.domain
- JSONP
- CORS
- window.name
- postMessage H5
需要跨域的场景:
- 上传图片、文件
- 富文本编辑器
- 页面请求第三方接口
降域 document.domain
将两个不同源的域名document.domain设置为同一个即可;存在安全性问题,一个网站被攻击,另一个也有安全漏洞,只适用于cookie和iframe窗口。
跨域资源共享 CORS
设置服务器响应头 Access-Control-Allow-Origin 指定允许跨域的源,实现浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
JSON with Padding JSONP
动态插入script标签,通过script标签引入一个js文件, 在服务端输出JSON数据,客户端执行回调函数,从而解决了跨域的数据请求。 jsonp+padding–将json填充到一个盒子里,(使用回调函数获取json数据);兼容性好,简单易用,支持浏览器与服务器双向通信。当然也有一些缺点:权限漏洞,只能发送GET请求,需要防止XSS。
window.name
一个窗口的声明周期内,窗口载入的所有页面都是共享一个name属性的,每个页面都对window.name有读写权限,其属性持久存在,不因新页面载入而进行充值。
在原页面中使用一个隐藏的iframe充当中间人角色,由iframe去获取数据,src设为目标页面,再把src设置跟原页面同一个域,否则受到同源策略的限制。原页面再去得到iframe获取到的数据,iframe的window.name。
postMessage
H5提供的一个API