安全使用不受信任的内容

Adobe AIR 1.0 和更高版本

未分配给应用程序沙箱的内容可以为应用程序提供其他脚本功能,但前提是满足运行时的安全条件。本主题介绍 AIR 安全协议以及非应用程序内容。

Security.allowDomain()

AIR 应用程序限制脚本访问非应用程序内容比 Flash Player 浏览器插件限制脚本访问不受信任内容更严格。例如,在浏览器的 Flash Player 中,当分配给 local-trusted 沙箱的 SWF 文件调用 System.allowDomain() 方法时,将向从指定域中加载的任何 SWF 授予脚本访问权限。不允许对 AIR 应用程序中的 application 内容使用类似方法,因为这将准予对用户文件系统中的非应用程序文件进行不合理访问。远程文件无法直接访问应用程序沙箱,不管是否调用了 Security.allowDomain() 方法。

通过脚本访问应用程序和非应用程序内容

通过脚本访问应用程序和非应用程序内容的 AIR 应用程序具有更复杂的安全安排。只允许不在应用程序沙箱中的文件使用沙箱桥来访问应用程序沙箱中的文件的属性和方法。沙箱桥充当应用程序内容与非应用程序内容之间的通道,在两个文件之间提供显式交互。如果使用正确,沙箱桥会提供额外的安全层,从而限制非应用程序内容访问属于应用程序内容的对象引用。

通过示例可以更好地说明沙箱桥的优点。假设 AIR 音乐商店应用程序需要为希望创建自己的 SWF 文件的广告商提供 API,商店应用程序可以使用这些文件进行通信。该商店需要为广告商提供在商店中查找艺术家和光盘的方法,另外出于安全原因,还需要将某些方法和属性与第三方 SWF 文件进行隔离。

沙箱桥可以提供此功能。默认情况下,在运行时从外部加载到 AIR 应用程序的内容无法访问主应用程序中的任何方法或属性。通过自定义沙箱桥,开发人员可以在不公开这些方法或属性的情况下为远程内容提供服务。将沙箱桥视为受信任内容和不受信任内容之间的通道,在加载方和被加载方内容之间提供通信而不公开对象引用。

有关如何安全使用沙箱桥的详细信息,请参阅 通过脚本访问不同域中的内容

防止动态生成不安全 SWF 内容

Loader.loadBytes() 方法为应用程序提供了一种从字节数组生成 SWF 内容的方式。但是,在加载内容时对从远程源加载的数据进行注入攻击可能会导致严重损坏。将数据加载到应用程序沙箱时尤其如此,生成的 SWF 内容可以在该应用程序沙箱中访问完整 AIR API。

存在一些合理的用法,可以使用 loadBytes() 方法而不生成可执行 SWF 代码。例如,可以使用 loadBytes() 方法生成图像数据,从而控制图像的显示时间。还存在一些 确实 依赖执行代码的合理用法,例如动态创建 SWF 内容以便播放音频。在 AIR 中,默认情况下 loadBytes() 方法 允许加载 SWF 内容;只允许加载图像内容。在 AIR 中, loadBytes() 方法的 loaderContext 属性具有 allowLoadBytesCodeExecution 属性,可以将该属性设置为 true ,以便明确允许应用程序使用 loadBytes() 来加载可执行 SWF 内容。下列代码说明如何使用此功能:

var loader:Loader = new Loader(); 
var loaderContext:LoaderContext = new LoaderContext(); 
loaderContext.allowLoadBytesCodeExecution = true; 
loader.loadBytes(bytes, loaderContext);

如果调用 loadBytes() 来加载 SWF 内容且 LoaderContext 对象的 allowLoadBytesCodeExecution 属性设置为 false (默认值),则 Loader 对象将引发 SecurityError 异常。

注: 在未来的 Adobe AIR 版本中,此 API 可能会更改。如果发生更改,您可能需要重新编译使用 LoaderContext 类的 allowLoadBytesCodeExecution 属性的内容。