安全发展

AIR 安全模型旨在向后与旧式 Ajax 模型兼容,同时降低向不受开发人员控制的数据公开系统 API 所带来的风险。在浏览器客户端-服务器模型中,浏览器负责处理大量演示和一些动态第三方数据加载。服务器处理大多数敏感操作并提供操作系统风格的设施,如存储、密码系统等。通过提供两个通过间接公开的函数通信的沙箱,Adobe AIR 减小了攻击者访问最终用户计算机和数据的几率。

利用 Ajax 框架

由于非应用程序沙箱是有效的 HTML 浏览器沙箱,因此 Ajax 开发人员会发现将现有应用程序和模式移植到 AIR 相对简单。例如,您可以从 Web 提取现有的填字游戏,然后将其整个插入到非应用程序沙箱帧中。

运行在非应用程序沙箱中的 Ajax 框架应按照其在 Web 浏览器中的运行方式运行,而一些依赖 eval() 和跨域代码加载的框架版本可能无法完全发挥作用。很大程度上取决于给定框架对 eval() 和类似行为的依赖程度,以及开发人员使用框架的哪些部分。

这些限制不会阻止将 eval() 和 JSON 对象文本一起使用。这样便可以将应用程序内容与 JSON JavaScript 库一起使用。但是,会限制应用程序沙箱内容使用重载的 JSON 代码(通过事件处理函数)。对于其他 Ajax 框架和 JavaScript 代码库,需检查框架或库中的代码是否在限制动态生成的代码时起作用。如果不起作用,则需要在非应用程序安全沙箱中包括使用框架或库的所有内容。

迁移应用程序

如果要提取简单的填字游戏并实现 saveGame() loadGame() 这样的函数,应如何操作?要完成此操作需要访问 AIR API,您可以在应用程序沙箱中实现相关的 API。然后,应用程序沙箱中的函数和数据将通过沙箱桥向非应用程序沙箱公开。概括地说,此流程包括以下步骤:

  1. 将原始根内容文件重命名为 someName.htm

  2. 创建一个名为 myRoot.htm 的文件,并包括指向 someName.htm IFRAME FRAME

  3. 编写调用 AIR API 的函数。不直接调用 API 会更安全。

  4. 创建用于向非应用程序沙箱公开应用程序沙箱功能的 parentSandboxBridge

    两个沙箱之间的通信可以是双向的: parentSandboxBridge childSandboxBridge 支持从两个方向遍历桥。 这让开发人员能够更好地控制应用程序和应用程序环境之间的内容流。

实际使用案例

Signet(面向 del.icio.us 用户的书签管理程序)是一款基于 HTML 的 AIR 应用程序,它通过以下方式实现 AIR 安全模型:

  1. 首先,创建 SignetRoot.htm ,让其包含 id 为 signetFrame 的帧和三个标识可用域的必需属性。

  2. SignetRoot.htm 中, onload 调用 SignetBridge.js ,后者包含所有公开的函数。

  3. 在 SignetBridge.js 中,通过 parentSandboxBridge signetFrame 公开这些函数。

  4. Signet.js 中,公开的函数可进行直接 AIR API 调用。例如, writeRscContentPriv 调用 writeRscContent

    虽然此方法比较简单,但其功效非常强大:可以为两个沙箱定义远程和本地域,在装载过程中启动桥,借助中间函数和桥 API 间接使用 API。