所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制,也可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
同源策略是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响,比如源a的js不能读取或设置引入的源b的元素属性。那么先定义下什么是同源,所谓同源,就是指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可。
同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本(如 Java)对不同域的服务进行跨站调用(通常指使用请求)。
跨域请求方式
解决跨域问题,最简单的莫过于通过nginx反向代理进行实现,但是其需要在运维层面修改,且有可能请求的资源并不再我们控制范围内(第三方),所以该方式不能作为通用的解决方案,下面介绍几种常用的跨域方式:
1.JSONP
AJAX请求受同源策略的影响,不允许进行跨域请求,而标签的src属性中的连接却可以访问跨域的JS脚本,利用这个特性,服务器端不再返回JSON格式的数据,而是返回一段调用某个函数的JS代码,在src中进行了调用,这样子就实现了跨域。JSONP只能发送get请求,且需要服务器端配合。
例如:< src=";></scri[t>
其中,callback=funcName是我们传给服务器的,服务器将我们需要的JSON数据作为参数传给这个函数,然后返回这个函数调用的JS文件。而这个funcName函数,需要我们在当前的文档中已经声明。
2.通过修改document.domain来跨子域
两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享cookie或者处理iframe。这种方法只适用于cookie和iframe窗口。cookie同源策略只关注域名,忽略协议和端口号。
3.使用片段标识符来进行跨域
父窗口可以把信息写入子窗口的片段标识符,子窗口通过监听hashchange事件得到通知。子窗口也可以改变父窗口的片段标识符。
4.使用window.name来进行跨域
window对象有一个name属性,在一个窗口的声明周期内,窗口载入的所有页面都是共享一个window.name的,每个页面对window.name都有读写的权限。这个属性的最大特点就是,无论是否同源,只要在一个窗口里,前一个网页设置了这个属性,后一个网页就可以读取它。
5.window.postmessage
window.postMessage是一个跨文档通信API,允许跨窗口通信,不论这两个窗口是否同源。
父窗口向子窗口发消息调用postMessage(“data”,URL);
子窗口设置监听message事件:window.onmessage=function(e){};
子窗口向父窗口发送消息:window.o(“data”,URL);
6.通过webSocket进行跨域
webSocket协议不受同源策略限制,只要服务器支持就可以通过它进行跨域通信。
7.通过设置代理的方法跨域
通过在同域名下的web服务器端创建一个代理,将浏览器的请求先发送给同域名下的服务器,由这个服务器去跨域请求其他不同域的服务器数据,然后在将数据传送回给前端。这里,同源限制只对客户端浏览器存在,对服务器端不存在同源限制。
8.CORS 跨域资源分享
CORS允许任何类型的请求,CORS需要浏览器和服务器同时支持,它允许浏览器向跨域服务器发出请求,从而克服了AJAX只能同源使用的限制。整个CORS通信的过程,都是浏览器自动完成的,不需要用户参与。浏览器一旦发现AJAX请求跨域,就会自动添加一些附加的头信息,有时还会多出一次附加的请求。
Origin字段:说明本次请求来自哪个源,服务器可以根据这个值决定是否同意这次请求;
服务器通过Acess-Control-Allow-Origin来设置允许响应来自哪些源的请求。
————————————————————————
SSL证书是HTTP明文协议升级HTTPS加密协议的重要渠道,是网络安全传输的加密通道。关于更多SSL证书的资讯,请关注数安时代(GDCA)。GDCA致力于网络信息安全,已通过WebTrust 的国际认证,是全球可信任的证书签发机构。GDCA专业技术团队将根据用户具体情况为其提供最优的产品选择建议,并针对不同的应用或服务器要求提供专业对应的HTTPS解决方案。