这些年,那些跨域

一、同源策略与跨站脚本攻击

  JavaScript 的同源策略,是由Netscape提出的一个著名的安全策略,为了阻止A站的JS去操作别的网站的数据。你想啊,你现在打开了浏览器,在一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改(比如说获取你的卡号和密码,又或者是转账到黑客的账户上等等),后果会非常严重!而同源策略就为了防止这种事情发生,它规定了A网站下的JS文件只能操作A网站下的数据,不能去操作B网站的数据。

二、跨域方式总结 

场景1-JSONP JSON with padding

  JSONP由两部分组成:回调函数和数据。通过动态创建script,再请求一个带参网址实现跨域通信,服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。

  优势:前后端易实现,兼容性好。

  问题:1、只能实现get请求2、不便处理接口错误 3、接口并发请求时,回调名必须不同

场景2-document.domain  

  有一个页面是http://www.example.com/a.html,

  在这个页面中还有一个http://www.child.example.com/b.html

  很显然,a.html与b.html是不同域的,所以我们无法通过在页面中书写js代码来获取iframe中的东西,但是,如果我们把这2个页面的document.domain都设置成相同的域名就可以了,需要注意的是,我们只能把document.domain设置成自身或更高一级的父域,且主域名必须相同。

  优势:document.domain适用于主域相同,不同子域的框架之间的交互。

  问题:非不同子域框架间无效。在file(本地文件访问)情况下,设置domain失效。

场景3-window.postMessage

  postMessage是HTML5中的API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:

  a.) 页面和其打开的新窗口的数据传递

  b.) 多窗口之间消息传递

  c.) 页面与嵌套的iframe消息传递

  d.) 上面三个场景的跨域数据传递

场景4-window.name

  window对象有个name属性,该属性有一个特征:即在一个窗口的生命周期内,窗口载入的所有页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的。

场景5-CORS跨域资源共享

  跨域资源共享定义了在必须访问跨域资源的时,浏览器与服务器应该如何沟通。他的原理是使用自定义的 HTTP 头部,让服务器与浏览器进行沟通,主要是通过设置响应头的 Access-Control-Allow-Origin 来达到目的的。

  优势:支持get、post各种请求方法。

  问题:兼容性,浏览器不能低于IE10。需要服务端设置报文头部。

场景6-反向代理跨域

  同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。

  实现思路:通过配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口。

  优势:不存在前端跨域问题,服务器间接口调用效率可以提高

  问题:多配置一台服务器,成本较高。

场景7- WebSocket协议

  WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很好的实现。

  原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。

  优势:跨域、全双工、服务器推送

  问题:需要服务器配套协议支持

场景8- location.hash + iframe跨域

  实现原理: a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

  具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。

三、工作中的实例

  1、Iframe在网络协议中的跨域document.domain

  异步上传文件的方式:

     1、ajax2级,实现post发送,真正的异步发送,但有兼容性问题。

    2、ajaxfileupload.js使用iframe实现异步上传。当需要用到跨域时要做修改。 

  2、Iframe在file协议中的跨域postMessage

  在一个c++客户端,内嵌html页面时,iframe之间的通信在file协议下收到限制

  3、Canvas读取图片数据cors

  为了实现在前端将图片黑白化处理,用到canvas读取图片。图片缓存服务器通常会跨域。 

  4、JSOP使用过程,回传格式有误

  回传必须是函数包裹数据,后端可能会失误,漏掉。或者回调名不变,当并发请求时会报错。 

  5、Img错误汇报,统计计数

  前端性能监控,错误监控,埋点计数等,使用图片的请求将数据发送回服务端。

  6、服务器反向代理,vue开发脚手架

  在本地开发Vue项目时,可以启用脚手架的代理服务,完成跨域访问测试环境。

原文地址:https://www.cnblogs.com/banyue/p/8687421.html

时间: 2024-10-27 04:46:19

这些年,那些跨域的相关文章

js跨域

第一次写博客,好紧张,不知道能写成啥样,哈哈哈. 自己的一知片解,有错请多多指教,嘻嘻嘻. 一.何为跨域? 只要协议.域名.端口后任何一个不同,就是跨域. 举个例子: http://www.example.com 协议不同 https://www.example.com http://www.example.com 域名不同 http://www.test.com http://www.example.com 端口不同 http://www.example.com:81 注意:ip相同,域名不同

实现AJAX跨域访问方式一

1.添加pom依赖 <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId> <version>2.6<ersion> <!--<scope>runtime</scope>--> </dependency> 2.在web.xml 中增加配置 &l

原生jsonp跨域

<script> // jsonp跨域原生写法 var script = document.createElement('script'); script.src = 'http://192.168.7.16/kuayu/test02.php?callback=aa'; document.body.appendChild(script); //aa('后台数据') function aa(res) { alert(res.website); } </script>

跨域cors方法(jsonp,document.domain,document.name)及iframe性质

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

什么是跨域?怎么解决跨域问题?

什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域) http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

AJAX跨域实现

原理:在同域中建立一个用于请求 别的域的代理程序,并将返回的内容发给客户端,客户端指向同域的这个代理程序 1. 客户端编写 // 其它部分都一样 //2.注册回调方法 callback xmlhttp.onreadystatechange = callback; //获取客户端内容 var userName = document.getElementById("UserName").value; //进行编码解决 中文乱码 userName = encodeURI(encodeURI(

1.NET Core Web Api跨域问题

官方说明 CORS means Cross-Origin Resource Sharing. Refer What is "Same Origin" Part Detailed Procedure 具体实践 需要引入 Microsoft.AspNetCore.Mvc.Cors 包 Cors配置 Startup.cs文件ConfigureServices方法中,将Cors服务放到容器中 services.AddCors(options); 传一个options,指定名字并配置它,这个时候

跨域问题解决方案

一.跨域问题存在的原因 二.跨域解决对比 JSONP对比CORS jsonp和cors都能解决 Ajax直接请求普通文件存在跨域无权限访问的问题 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS 三.CORS跨域解决方案 1.普通Servlet跨域问题解决 http:/

说一说javascript跨域和jsonp

同源策略 在浏览器的安全策略中“同源策略”非常如雷贯耳,说的是协议.域名.端口相同则视为同源,域名也可换成IP地址,不同源的页面脚本不能获取对方的数据. 要是想使用XMLHttpRequest或者常规的AJAX请求获取另一个站点的数据,浏览器会告诉你“XXXX is not allowed by Access-Control-Allow-Orign”. 因为同源策略的存在,防止了跨域访问的安全问题,但同时也损失了方便获取资源的便利. 跨域的src属性 世事又非绝对,浏览器还是允许几个元素跨域访问

iframe跨域访问

js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决; 父页访问子页,可以document.getElementById("myframe").contentWindow.document来访问iframe页面的内容:如果支持contentDocument也可以直接document.getElementById("myframe&