通过脚本访问不同域中的内容

Adobe AIR 1.0 和更高版本

AIR 应用程序在安装时会被授予特殊权限。不要将相同权限泄露给其他内容(包括不属于应用程序的远程文件和本地文件),这一点很重要。

关于 AIR 沙箱桥

通常,一个域中的内容无法调用其他域中的脚本。

但是仍存在这样一些情况:主 AIR 应用程序要求远程域中的内容对主 AIR 应用程序中的脚本具有受控访问权限,反之亦然。为此,运行时提供了 沙箱桥 机制,沙箱桥充当两个沙箱之间的通道。沙箱桥可以在远程安全沙箱和应用程序安全沙箱之间提供显式交互。

沙箱桥公开了以下两个对象,已加载和要加载的脚本都可以访问这两个对象:

  • parentSandboxBridge 对象允许要加载的内容将属性和函数公开给已加载的内容中的脚本。

  • childSandboxBridge 对象允许已加载的内容将属性和函数公开给要加载的内容中的脚本。

通过沙箱桥公开的对象按值而不是按引用进行传递。所有数据都会序列化。这意味着由桥的一端公开的对象无法由另一端设置,并且公开的对象为无类型对象。此外,只能公开简单对象和函数;不能公开复杂对象。

如果子级内容尝试设置 parentSandboxBridge 对象的属性,则运行时会引发 SecurityError 异常。同样,如果父级内容尝试设置 childSandboxBridge 对象的属性,则运行时也会引发 SecurityError 异常。

沙箱桥示例 (HTML)

在 HTML 内容中,会将 parentSandboxBridge childSandboxBridge 属性添加到子级文档的 JavaScript window 对象中。有关如何在 HTML 内容中设置桥函数的示例,请参阅 设置沙箱桥接口

限制 API 公开

公开沙箱桥时,公开限制沙箱桥滥用程度的高级别 API 非常重要。请注意,调用桥实施的内容可能会被破坏(例如,通过插入代码)。因此(举例来说),通过桥公开 readFile(path) 方法(读取任意文件的内容)易于受到滥用。最好公开未使用路径且读取特定文件的 readApplicationSetting() API。一旦应用程序部分受到损坏,语义方法越多,就越能限制应用程序产生的破坏。