window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机  (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。

otherWindow.postMessage(message, targetOrigin, [transfer]);

1.otherWindow

其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。

2.message

将要发送到其他 window的数据。它将会被结构化克隆算法序列化。这意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化。

3.targetOrigin

通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串”“(表示无限制)或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。这个机制用来控制消息可以发送到哪些窗口;例如,当用postMessage传送密码时,这个参数就显得尤为重要,必须保证它的值与这条包含密码的信息的预期接受者的orign属性完全一致,来防止密码被恶意的第三方截获。如果你明确的知道消息应该发送到哪个窗口,那么请始终提供一个有确切值的targetOrigin,而不是不提供确切的目标将导致数据泄露到任何对数据感兴趣的恶意站点。

4.transfer

是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

看一下具体使用示例

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>父页面</title>
</head>
<body>
<input name="ta" id="data" type="text" value="发送数据给子页面"/>
<button onclick="send()" id="btn">post message to children</button>
<div id="div" style="background: green;color: red;height: 30px"></div>
<iframe src="http://172.22.6.12:8080/taskGuidePcT.html" name="postIframe"></iframe><script>function send() {var data = document.getElementById('data').valuevar url = location.originwindow.postIframe.postMessage(data,url); //发送数据}window.onmessage = function(e){e = e || event;document.getElementById("div").innerHTML = e.data;}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>子页面</title>
</head>
<body>
<input name="ta" id="data" type="text" value="发送数据给父页面"/>
<button onclick="send()" id="btn">post message to parent</button>
<div id="div" style="height: 30px"></div>
<script>var originwindow.onmessage = function(e){origin = e.origine = e || event;document.getElementById("div").innerHTML = e.data;}function send() {var data = document.getElementById('data').valuewindow.parent.postMessage(data, origin)}
</script>
</body>
</html>

如果您不希望从其他网站接收message,请不要为message事件添加任何事件侦听器。 这是一个完全万无一失的方式来避免安全问题。

如果您确实希望从其他网站接收message,请始终使用origin和source属性验证发件人的身份。 任何窗口(包括例如http://evil.example.com)都可以向任何其他窗口发送消息,并且您不能保证未知发件人不会发送恶意消息。 但是,验证身份后,您仍然应该始终验证接收到的消息的语法。 否则,您信任只发送受信任邮件的网站中的安全漏洞可能会在您的网站中打开跨网站脚本漏洞。

当您使用postMessage将数据发送到其他窗口时,始终指定精确的目标origin,而不是*。 恶意网站可以在您不知情的情况下更改窗口的位置,因此它可以拦截使用postMessage发送的数据。

前端跨域之PostMessage详解相关推荐

  1. 关于前端跨域及解决方案详解

    关于前端跨域 跨域指的是一个域下的文档或脚本试图去请求另一个域下的资源.我们常说的跨域,也就是指由浏览器同源策略限制的一类请求场景. 同源指的是协议,域名和端口号相同,一旦有一个不相同,则为不同源.同 ...

  2. 前端跨域之CORS详解

    CORS:跨源资源分享Cross-Origin Resource Sharing. 它是W3C标准,是跨源AJAX请求的根本解决方法.相比JSONP只能发GET请求,CORS允许任何类型的请求.COR ...

  3. python跨域攻击教学_关于python 跨域处理方式详解

    因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送ht ...

  4. 跨域资源共享CORS详解

    最近深入了解了CORS的相关东西,觉得阮一峰老师的文章写得最详细易懂了,所有转载作为学习笔记. 原文地址:跨域资源共享 CORS 详解 CORS是W3C的一个标准,全称是跨域资源共享(Cross-or ...

  5. 解决跨域问题(详解9种方法)

    同源策略:端口号.协议.域名相同 . 一.为什么会出现跨域问题         出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如 ...

  6. 前端跨域的理解和解决跨域的方案详解(全)

    作为前端开发,我们遇到最多的应该就是跨域问题,对于萌新来说,跨域就是一道墙,不知所措,其实只要理解了跨域的含义和原理,解决它是不难的,今天给大家介绍下什么是跨域和跨域的解决方案! 什么是跨域? 跨域是 ...

  7. 前端:下载文件实现方式及跨域下载(详解)

    前言:本文详细介绍在开发过程中前端如何与后端配合实现文件下载至本地,并详细说明特殊格式文件如何处理.如果你是一名前端开发者,恰好需要实现后端文件下载至本地的需求,那么恭喜你本篇文章一定会帮到你! 需求 ...

  8. js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  9. AJAX跨域资源共享 CORS 详解

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

最新文章

  1. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...
  2. php 判断设备来源,PHP判断移动设备来源的方法
  3. 最全的jquery datatables api 使用详解
  4. 双指针法(leetcode分类解题,C++代码详细注释)
  5. 加密机组会 会议纪要
  6. Beamer演示时不能正常显示底栏的问题及解决
  7. 在网页中嵌入任意字体(特殊字体/自定义字体)的解决方案
  8. 安装mysql没有密码_如何在没有密码提示的情况下安装MySQL?
  9. 用c语言输出100到200之间的素数
  10. tftpd linux,用DHCP,NFS,tftpd搭建PXE无人值守安装linux操作系统
  11. 专题一:Labview表格控件 及 应用(三)在表格中插入一行数据
  12. 【STC单片机学习】第二课:单片机是什么东西
  13. 如何在 Linux 系统中添加桌面图标
  14. matlab atem(),非特定人的英文
  15. CAD偏移尺寸出问题该如何解决?
  16. Kafka坑之一:Lag与HW、LEO
  17. 资源收集贴(持续更新...)
  18. WiFi安全现状,70%的WiFi可被快速破解
  19. android listview替代,Android笔记——RecyclerView替代ListView
  20. 三极管开关电路参数设计与参数介绍

热门文章

  1. 密码找回安全总结-业务安全测试实操(29)
  2. 高效学好英语口语的4个方法
  3. 下定决心,学好日语!
  4. 见性志诚,念念回首处,即是灵山——2017下半年总结
  5. react函数子组件向父组件传值
  6. 7天入门Python 3 — Python对象属性及核心数据类型
  7. 机器学习笔记(七)——初识逻辑回归、不同方法推导梯度公式
  8. 梯度计算公式-函数实现组件
  9. 做算法工程师是什么样的工作体验
  10. sqlserver2017