http://help.adobe.com/zh_CN/AIR/1.1/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7f05.html
AIR 提供了一个综合全面的安全体系结构,用于定义 AIR 应用程序中的每个文件的相应内部和外部权限。权限会根据文件的源授予给文件,并被分配到称为“沙箱”的逻辑安全组中。
关于 AIR 应用程序沙箱
沙箱的运行时安全模型由 Flash Player 安全模型以及应用程序沙箱组成。不在应用程序沙箱中的文件具有类似 Flash Player 安全模型指定的安全限制。
运行时使用这些安全沙箱定义代码可以访问的数据范围以及可以执行的操作。若要维护本地安全,请将各个沙箱中的文件进行隔离。例如,从外部 Internet URL 加载到 AIR 应用程序的 SWF 文件放置在远程沙箱中,该文件默认情况下不具有通过脚本访问应用程序目录中分配给应用程序沙箱的文件的权限。
下表描述了各种类型的沙箱:
沙箱 | 说明 |
应用程序 | 文件位于应用程序目录中,并且使用完全 AIR 权限运行。 |
远程 | 文件来自 Internet URL,并且通过基于域的沙箱规则运行,该规则与适用于 Flash Player 中的远程文件的规则类似。(每个网络域都具有单独的远程沙箱,例如 http://www.example.com 和 https://foo.example.org。) |
受信任的本地 | 文件为本地文件,且用户已使用“设置管理器”或 Flash Player 信任配置文件将其指定为受信任。文件可以从本地数据源读取数据并且与 Internet 通信,但不具有完全 AIR 权限。 |
只能与远程内容交互 | 文件为使用网络名称发布的本地 SWF 文件,但尚未受到用户的显式信任。文件可以与 Internet 进行通信,但不能从本地数据源读取数据。此沙箱仅可用于 SWF 内容。 |
只能与本地文件系统内容交互 | 文件为未使用网络名称发布的本地脚本文件,且尚未受到用户的显式信任。文件包含尚未受到信任的 JavaScript 文件。文件可以从本地数据源读取数据,但无法与 Internet 进行通信。 |
本主题重点介绍了应用程序沙箱及其与 AIR 应用程序中的其它沙箱之间的关系。开发人员在使用分配到其它沙箱的内容时,应阅读针对 Flash Player 安全模型的其它文档。请参阅《ActionScript 3.0 编程》(http://www.adobe.com/go/flashCS3_progAS3_security_cn) 文档中的“Flash Player 安全性”一章以及《Flash Player 9 安全性白皮书》(http://www.adobe.com/go/fp9_0_security_cn)。
应用程序沙箱
安装应用程序时,AIR 安装程序文件中包括的所有文件都会安装到用户计算机的应用程序目录中。开发人员可以通过app:/URL 方案参考此目录中的代码(请参阅在 URL 中使用 AIR URL 方案)。在应用程序运行时,应用程序目录树中的所有文件都会分配到应用程序沙箱中。应用程序沙箱中的内容具有 AIR 应用程序的完全访问权限,包括与本地文件系统内容进行交互。
许多 AIR 应用程序只能使用这些本地安装的文件来运行应用程序。但是,不会限制 AIR 应用程序仅加载应用程序目录中的文件,它们可以加载任意源中任何类型的文件。其中包括用户计算机上的本地文件以及可用外部源中的文件(例如本地网络或 Internet 上的文件)。文件类型不会对安全限制产生影响;加载的 HTML 文件与从相同源加载的 SWF 文件具有相同的安全权限。
应用程序安全沙箱中的内容可以访问 AIR API,而其它沙箱中的内容则无法访问。例如,限制air.NativeApplication.nativeApplication.applicationDescriptor属性(该属性返回应用程序的应用程序描述符文件的内容)访问应用程序安全沙箱中的内容。另一个示例是受限制的 API 为 FileStream 类,其中包含用于读取和写入本地文件系统的方法。
《Flex 3 语言参考》中介绍了限制访问应用程序安全沙箱中的内容的 ActionScript API 以及 AIR 徽标。
对于 HTML 内容(位于 HTMLLoader 对象中),所有 AIR JavaScript API(使用 AIRAliases.js 文件时通过window.runtime属性或air对象可用)都可用于应用程序安全沙箱中的内容。其它沙箱中的 HTML 内容无法访问window.runtime属性,因此该内容也无法访问 AIR API。
JavaScript 和 HTML 限制
对于应用程序安全沙箱中的 HTML 内容,在加载代码后使用可将字符串动态转换为可执行代码的 API 时存在一些限制。这样就可以阻止应用程序从非应用程序源(例如潜在不安全网络域)意外插入(及执行)代码。使用eval()函数是一个示例。有关详细信息,请参阅对不同沙箱中的内容的代码限制。
对 ActionScript 文本字段内容中的 img 标签的限制
为了阻止潜在仿冒攻击,在应用程序安全沙箱的 SWF 内容中忽略了 ActionScript TextField 对象的 HTML 内容中的img标签。
asfunction 的限制
应用程序沙箱中的内容无法在 ActionScript 2.0 文本字段的 HTML 内容中使用asfunction协议。
无法访问跨域永久性缓存
应用程序沙箱中的 SWF 内容无法使用跨域缓存,这是一项增加到 Flash Player 9 Update 3 的功能。Flash Player 通过此功能可以永久缓存 Adobe 平台组件内容,并根据需要在加载的 SWF 内容中重复使用该内容(无需多次重新加载该内容)。
非应用程序沙箱中的内容的权限
从网络或 Internet 位置加载的文件会分配到远程沙箱中。从应用程序目录外部加载的文件会分配到只能与本地文件系统内容交互、只能与远程内容交互或受信任的本地沙箱中;具体取决于文件的创建方式以及用户是否通过 Flash Player 全局设置管理器显式信任了文件。有关详细信息,请参阅 http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager.html。
JavaScript 和 HTML 限制
与应用程序安全沙箱中的内容不同,非应用程序安全沙箱中的 JavaScript 内容随时都可以调用eval()函数来执行动态生成的代码。但是,非应用程序安全沙箱中的 JavaScript 存在一些限制。这些限制包括:
- 非应用程序沙箱中的 JavaScript 代码无法访问window.runtime对象,也无法执行 AIR API。
- 默认情况下,非应用程序安全沙箱中的内容无法使用 XMLHttpRequest 调用从调用该请求的域之外的其它域加载数据。但是,通过设置包含 frame 或 iframe 中的allowCrossdomainXHR属性,应用程序代码可以授予非应用程序内容执行此操作的权限。有关详细信息,请参阅通过脚本访问不同域中的内容。
- 调用 JavaScriptwindow.open()方法时存在一些限制。有关详细信息,请参阅调用 JavaScript window.open() 方法的限制。
有关详细信息,请参阅对不同沙箱中的内容的代码限制。
加载 CSS、frame、iframe 和 img 元素的限制
远程(网络)安全沙箱中的 HTML 内容只能从远程域(网络 URL)加载 CSS、frame、iframe和img内容。
只能与本地文件系统内容交互的沙箱、只能与远程内容交互的沙箱或受信任的本地沙箱中的 HTML 内容只能从本地沙箱(而不是应用程序或网络 URL)加载 CSS、frame、iframe和img内容。