跨域学习笔记

参考链接:九种跨域方式实现原理(完整版)

跨域的问题,自己碰到过,用的是CORS解决方案。

看到一篇文章,做下总结:

1、什么是跨域?同源策略,XSS、CSFR等攻击(DDOS攻击)

所谓同源是指“协议+域名+端口”三者相同,当协议、子域名、主域名、端口号中任意一个不相同,即不同域;不同域之间相互请求资源,就算“跨域”。

三个标签是允许跨域加载资源:<img src="xxx"> <link href="xxx"> <script src="xxx">。

跨域并不是请求发布出去,请求能发出去,服务能收到请求并正常返回结果,只是结果被浏览器拦截了。

同时也说明了跨域并不能完全阻止 CSRF,因为请求毕竟是发出去了。

2、跨域解决方案

1)、JSONP:利用<script>标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的JSON(JavaScript Object Notation)数据。JSONP的请求一定要对方的服务器做支持才可以。

JSONP和AJAX对比:两者都是客服端向服务器端发送请求,从服务器获取数据的方式。但AJAX属于同源策略,JSONP属于非同源策略。

JSONP:优点,兼容性好,可用于主流浏览器的跨域数据访问问题。缺点是仅支持get方法,具有局限性,不安全,可能会遭受XSS攻击(XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中)。

JSONP都是GET和异步请求的,不存在其他请求方式和同步请求,且jQuery默认会给JSONP的请求清楚缓存。

2)、CORS:需要浏览器和后端同时支持,关键是后端。浏览器会自动进行CORS通信,只要后端实现了CORS,就实现了跨域。服务器设置Access-Control-Allow-Origin。

3)、postMessage:未接触过。

4)、webSocket:WebSocket是HTML5的一个持久化协议,它实现浏览器和服务器的全双工通信,同时也是跨域的一种解决方案。WebSocket和Http都是应用层协议,都基于TCP协议。(辐射到计算机网络知识:五层,各个层的协议,数据格式)。

WebSocket是一种双向通信协议,在建立连接之后,WebSocket的client和server都能主动向对方发送或接受数据。同时,WebSocket在建立连接时需要借助http协议,连接建立后client和server之间的双向通信就和HTTP无关了。

5)、Node中间件代理(两次跨域)

实现原理:同源策略是浏览器所遵循的标准,而如果是服务器向服务器发送请求就无需遵循同源策略。

代理服务器:需要做以下几个步骤:

接受客户端请求。

将请求转发给服务器。

拿到服务器相应数据。

将响应转发给客户端。

6)、Nginx反向代理

实现原理类似于Node中间件代理,需要你搭建一个Nainx服务器,用于转发请求。使用Nginx反向代理,实现跨域,是最简单的跨域方式。只需要修改Nginx配置,即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不影响服务器性能。(更多参考Nginx配置)

7)、window.name + iframe:通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外语传递到本地域。这个就巧妙的绕开了浏览器的跨域访问限制,同时它又是安全操作。

8)、location.hash + iframe: 待了解

9)、document.domain + iframe: 待了解

总结:

  • CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案。
  • JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
  • 不管是Node中间件代理还是Nginx反向代理,主要是通过同源策略对服务器不加限制
  • 日常工作中,用的比价多的是CORS和Nginx方向代理。(面试时基本上问跨域要说到这两点,不管有没有做过)
原文地址:https://www.cnblogs.com/meng9527/p/10345573.html