写点什么

CrossFrame:为 Mashup 准备的安全的器件间跨域通信

  • 2007-11-29
  • 本文字数:1304 字

    阅读完需:约 4 分钟

来自 Yahoo! 的 DHTML 传道团队的 Julien Lecomte,宣布发布“ CrossFrame,一种安全的跨文档和跨域的通信机制”。按照 Julien 的说法,这种“Hack”的手段,能让同一页面上来自不同域的 IFrames 互相通讯。传统上出于安全方面的考虑,不同域上资源的通讯比较困难,这就是浏览器上所谓的“同源策略(Same Origin Policy)”。CrossFrame 以 URL 片段标识符(URL fragment identifier) 作为构建的基础,着手解决了两方面重要的问题:

  • 接受者必须进行轮询,导致无谓的 CPU 开销。
  • 在 Safari 和 Opera 上产生“伪”历史记录。

CrossFrame 让跨域的各站点都共享宿主页面上使用的变量。流程主要分两步:

为了能够与在 Y 域上运行的 Mashup 通信,位于 X 域的页面动态创建一个隐藏的 IFrame 并指向位于 Y 域的一个特殊的代理文件,并利用 URL 片段标识符来运送消息。(第一步)当这个位于隐藏 IFrame 的特殊代理文件加载完毕后,就读取它的 URL 片段标识符,并将之传递给容纳了 Mashup 的 IFrame 内的一段全局函数,(第二步)使用 parent.frames[‘mashup’] 就可获取到所需对象。

使用 CrossFrame 非常简单,安装一个代理文件,导入所需的 JavaScript 库文件,就可以通过 JavaScript 代码开始发送与接收:

登记 onMessage 事件以接收信息:

YAHOO.util.CrossFrame.onMessageEvent.subscribe(<br></br>    function (type, args, obj) {<br></br>        var message = args[0];<br></br>        var domain = args[1];<br></br>       // 以下处理接收到的信息 <br></br>    }<br></br>);要发送信息,调用 YAHOO.util.CrossFrame.send():

YAHOO.util.CrossFrame.send("http://www.y.com/proxy.html",<br></br>                           "frames['mashup']",<br></br>                           "message");

相关的演示已经准备好,可从中了解一下它在浏览器运作的实际情形。

Facebook 在他们的 Beacon 工具中亦使用 IFrames 的思路来实现通讯。在 Jay Goldman 的一篇《 Deconstructing Facebook Beacon Javascript 》博文中,他把这种方法形容为:

对现代浏览器的跨域脚本安全特性的一种漂亮的规避。

在文章的结尾,Julien 也告诫了使用 CrossFrame 带来的危害:

这种 Hack 手法会带来危险。首先,浏览器的厂商可能会更改它们的安全策略,比如改成像 Opera 那样的行为。

他接着说 > 而且,我不推荐使用 Hack 因为它们会减缓 Web 的革新速度。

最后结论 > 因此,虽然看起来有点矛盾,我不推荐使用 CrossFrame(或者任何其他不堪的 hack 手段)。

令人遗憾,时下谈到合乎规范的页面内器件通信技术,开发者的选择并不多。虽然已经在拟订相关的草案来解决这个问题,但是距离浏览器的标准化实现还需一段时间。与此同时,如果有些事情非要在现在的浏览器上就做到,那么CrossFrame Hack 也不失为一种可行的方案。

查看英文原文: CrossFrame - Safe, Cross Domain Widget Coordination for Mashups - - - - - -

译者简介:Frank Cheung 有多年 Web 前端开发经验,动态语言爱好者。负责 EXT 中文站( www.ajaxjs.com )JavaScript 开源论坛 Js 堂( jstang.5d6d.com )的维护工作。专注 Ajax 和 WebUI, 从 YUI-Ext 起,翻译了不少 EXT 相关的资料。

2007-11-29 19:411032

评论

发布
暂无评论
发现更多内容

“2021ISIG中国产业智能大会低代码峰会”即将开幕,钉钉宜搭叶周全受邀出席

一只大光圈

阿里巴巴 互联网 钉钉 低代码 钉钉宜搭

SAP CRM Survey调查问卷的模型设计原理解析

汪子熙

中间件 CRM SAP C4C 11月日更

我们如何实现“业务 100% 云原生化,让阿里中间件全面升级到公共云架构”?

阿里巴巴中间件

阿里云 云原生 中间件 三位一体

《深入理解JVM虚拟机》读书笔记:第一章

Joseph295

Flutter设置App的应用名字和应用logo图标的方法

坚果

flutter 11月日更

使用 NextJS 和 TailwindCSS 重构我的个人博客

狂奔滴小马

大前端 Blog nextjs

使用 Omnibus 安装极狐GitLab

极狐GitLab

极狐GitLab 安装使用

智能运维中的指标预测

云智慧AIOps社区

算法 智能运维 预测 指标

正确学习大数据开发技术的方法有哪些

@零度

大数据

Python代码阅读(第62篇):列表是否包含相同元素判断

Felix

Python 编程 列表 阅读代码 Python初学者

今日谈:BoltDB数据库,一款纯Go实现的KV数据库

恒生LIGHT云社区

数据库 Go 语言 BoltDB

一起来写 VS Code 插件:为你的团队提供常用代码片段

狂奔滴小马

vscode 大前端

一起来写 VS Code 插件:实现一个翻译插件

狂奔滴小马

JavaScript vscode 大前端 vs

Android C++系列:Linux进程间通信(一)

轻口味

c++ android 11月日更

Linux学习有用吗?《Linux一学就会》

侠盗安全

Linux linux运维 云计算架构师 linux电子书

首发!OceanBase社区版入门教程开课啦!

OceanBase 数据库

数据库 开源 新闻 课程 oceanbase

一文讲透如何用明道云构建物料需求计划系统

明道云

图论算法:稳定婚姻问题,如何找到最适合自己的另一半

博文视点Broadview

java语言前景怎么样,到底需不需要参加培训

@零度

Java JAVA开发

用 NodeJS 开发一版在线流程图网站

狂奔滴小马

JavaScript 大前端 Node

零基础学习前端开发技术的方法分享

@零度

大前端

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一起探索一下DefaultMQPullConsumer的实现原理及源码分析

洛神灬殇

阿里巴巴 RocketMQ 消息队列 11月日更 Apache RocketMQ

使用 ABAP 代码提交 SAP CRM Survey 调查问卷

汪子熙

CRM SAP abap 11月日更 问卷模型

netty系列之:在http2中使用framecodec

程序那些事

Java java 并发 程序那些事 11月日更

人脸检测实战:使用opencv加载深度学习模型实现人脸检测

AI浩

Vue都使用那么久了,还不了解它的生命周期吗

CRMEB

百亿级存储+毫秒级写入!TDengine如何轻松玩转“潮鞋”APP?

TDengine

tdengine 时序数据库

StarRocks Hacker Meetup 小记 Part 2|实时更新场

StarRocks

大数据 Meetup StarRocks

一起来写 VS Code 插件:VS Code 版 CNode 已上线

狂奔滴小马

JavaScript vscode 大前端

入驻快讯|欢迎ShowMeBug正式入驻 InfoQ 写作平台!

InfoQ写作社区官方

管理纪要

KoLee

CrossFrame:为Mashup准备的安全的器件间跨域通信_安全_Gavin Terrill_InfoQ精选文章