安全沙箱

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

客户端计算机可以获得包含来自许多源(如外部网站、本地文件系统或安装的 AIR 应用程序)的代码、内容和数据的各个文件。Flash Player 和 AIR 运行时会根据代码文件及其他资源(如共享对象,位图、声音、视频和数据文件)加载时的来源分别将其分配到安全沙箱中。以下部分介绍运行时强制执行的规则,这些规则控制着在给定沙箱内执行的代码或内容可以访问哪些内容。

有关 Flash Player 安全性的详细信息,请参阅 Flash Player 开发人员中心主题“安全性”,网址为 www.adobe.com/go/devnet_security_cn

远程沙箱

Flash Player 和 AIR 运行时将来自 Internet 的资源(包括 SWF 文件)分类到与其原始域对应的单独沙箱中。例如,会将从 example.com 加载的资源放置到与从 foo.org 加载的资源不同的安全沙箱中。默认情况下,对这些文件授予访问其自身所在服务器中任何资源的权限。通过显式的 Web 站点许可和作者许可(例如 URL 策略文件和 Security.allowDomain() 方法),可以允许远程 SWF 文件访问其他域的其他数据。有关详细信息,请参阅网站控制(策略文件)作者(开发人员)控制

远程 SWF 文件无法加载任何本地文件或资源。

有关 Flash Player 安全性的详细信息,请参阅 Flash Player 开发人员中心主题“安全性”,网址为 www.adobe.com/go/devnet_security_cn

本地沙箱

“本地文件”是指通过使用 file: 协议或统一命名约定 (UNC) 路径引用的任何文件。本地 SWF 文件放置在四个本地沙箱中的一个内:

  • 只能与本地文件系统内容交互的沙箱 — 出于安全方面的考虑,默认情况下,Flash Player 和 AIR 运行时会将所有本地文件放置在只能与本地文件系统内容交互的沙箱中。通过此沙箱,可执行代码可以读取本地文件(例如通过使用 URLLoader 类),但无法通过任何方式与网络通信。这样可向用户保证本地数据不会泄漏到网络或以其他方式不适当地共享。

  • 只能与远程内容交互的沙箱 — 编译 SWF 文件时,可以指定该文件作为本地文件运行时拥有网络访问权限(请参阅设置本地 SWF 文件的沙箱类型)。这些文件位于只能与远程内容交互的沙箱中。分配到只能与远程内容交互的沙箱中的 SWF 文件将失去其本地文件访问权限,但允许这些 SWF 文件访问网络中的数据。不过,只有通过 URL 策略文件或调用 Security.allowDomain() 方法来授予操作权限,才允许远程内容交互的 SWF 文件读取源自网络的数据。为授予此类权限,URL 策略文件必须向“所有”域授予权限,方法是使用 <allow-access-from domain="*"/> 或使用 Security.allowDomain("*")。有关详细信息,请参阅网站控制(策略文件)作者(开发人员)控制

  • 受信任的本地沙箱 — 注册为受信任(由用户或安装程序注册)的本地 SWF 文件放置在受信任的本地沙箱中。系统管理员和用户还可以根据安全注意事项将本地 SWF 文件重新分配(移动)到受信任的本地沙箱,或者从受信任的本地沙箱重新分配(移动)本地 SWF 文件(请参阅管理员控制用户控制)。分配到受信任的本地沙箱的 SWF 文件可以与其他任何 SWF 文件交互,也可以从任何位置(远程或本地)加载数据。

  • AIR 应用程序安全沙箱 — 该沙箱包含在运行 AIR 应用程序时安装的内容。默认情况下,在 AIR 应用程序沙箱中执行的代码可跨脚本访问来自任何域的代码。但是,不允许 AIR 应用程序沙箱外的文件跨脚本访问应用程序沙箱内的代码。默认情况下,AIR 应用程序沙箱内的代码和内容可加载来自任何域的内容和数据。

只能与远程内容交互的沙箱和只能与本地文件系统内容交互的沙箱之间的通信以及只能与本地文件系统内容交互的沙箱和远程沙箱之间的通信是严格禁止的。运行于 Flash Player 中的应用程序或用户/管理员不能授予允许此类通信的权限。

在本地 HTML 文件和本地 SWF 文件之间以任一方向访问脚本(例如使用 ExternalInterface 类)均要求涉及的 HTML 文件和 SWF 文件应位于受信任的本地沙箱中。这是因为浏览器的本地安全模型与 Flash Player 本地安全模型不同。

只能与远程内容交互的沙箱中的 SWF 文件无法加载只能与本地文件系统内容交互的沙箱中的 SWF 文件。只能与本地文件系统内容交互的沙箱中的 SWF 文件无法加载只能与远程内容交互的沙箱中的 SWF 文件。

AIR 应用程序沙箱

Adobe AIR 运行时可以向 Flash Player 安全沙箱模型添加其他的沙箱,称为应用程序沙箱。作为 AIR 应用程序一部分安装的文件将加载到应用程序沙箱内。由应用程序加载的任何其他文件具有的安全限制与常规 Flash Player 安全模型指定的安全限制相对应。

安装应用程序时,AIR 包中包括的所有文件都将安装到用户计算机上的应用程序目录下。开发人员在代码中可以通过 app:/ URL 方案引用此目录(请参阅 URI 方案)。 在应用程序运行时,应用程序目录树中的所有文件都会分配到应用程序沙箱中。应用程序沙箱中的内容具有 AIR 应用程序的完全访问权限,包括与本地文件系统内容进行交互。

许多 AIR 应用程序只能使用这些本地安装的文件来运行应用程序。但是,不会限制 AIR 应用程序仅加载应用程序目录中的文件,它们可以加载任意源中任何类型的文件。其中包括用户计算机上的本地文件以及可用外部源中的文件(例如本地网络或 Internet 上的文件)。文件类型不会对安全限制产生影响;加载的 HTML 文件与从相同源加载的 SWF 文件具有相同的安全权限。

应用程序安全沙箱中的内容可以访问 AIR API,而其他沙箱中的内容则无法访问。例如,限制 air.NativeApplication.nativeApplication.applicationDescriptor 属性(该属性返回应用程序的应用程序描述符文件的内容)访问应用程序安全沙箱中的内容。另一个示例是受限制的 API 为 FileStream 类,其中包含用于读取和写入本地文件系统的方法。

用于 Adobe Flash Platform 的 ActionScript 3.0 参考 中,仅用于应用程序安全沙箱中的内容的 ActionScript API 将使用 AIR 徽标指示。在其他沙箱中使用这些 API 会导致运行时引发 SecurityError 异常。

对于 HTML 内容(位于 HTMLLoader 对象中),所有 AIR JavaScript API(使用 AIRAliases.js 文件时通过 window.runtime 属性或 air 对象可用)都可用于应用程序安全沙箱中的内容。其他沙箱中的 HTML 内容无权访问 window.runtime 属性,因此该内容无法访问 AIR 或 Flash Player API。

在 AIR 应用程序沙箱内执行内容具有下列额外的限制:

  • 对于应用程序安全沙箱中的 HTML 内容,在加载代码后使用可将字符串动态转换为可执行代码的 API 时存在一些限制。这是为了阻止应用程序从非应用程序源(例如潜在不安全网络域)意外插入(及执行)代码。使用 eval() 函数是一个示例。有关详细信息,请参阅对不同沙箱中的内容的代码限制

  • 为了阻止潜在仿冒攻击,在应用程序安全沙箱的 SWF 内容中忽略了 ActionScript TextField 对象的 HTML 内容中的 img 标签。

  • 应用程序沙箱中的内容无法在 ActionScript 2.0 文本字段的 HTML 内容中使用 asfunction 协议。

  • 应用程序沙箱中的 SWF 内容无法使用跨域缓存,这是一项增加到 Flash Player 9 Update 3 的功能。Flash Player 通过此功能可以永久缓存 Adobe 平台组件内容,并根据需要在加载的 SWF 内容中重复使用该内容(无需多次重新加载该内容)。

对 AIR 内的 JavaScript 的限制

与应用程序安全沙箱中的内容不同,非应用程序安全沙箱中的 JavaScript 内容随时都可以调用 eval() 函数来执行动态生成的代码。但是,对 AIR 内在非应用程序安全沙箱中运行的 JavaScript 具有限制。这些项目包括:

  • 非应用程序沙箱中的 JavaScript 代码无法访问 window.runtime 对象,也无法执行 AIR API。

  • 默认情况下,非应用程序安全沙箱中的内容无法使用 XMLHttpRequest 调用从调用该请求的域之外的其他域加载数据。但是,通过设置包含 frame 或 iframe 中的 allowCrossdomainXHR 属性,应用程序代码可以授予非应用程序内容执行此操作的权限。有关详细信息,请参阅对不同沙箱中的内容的代码限制

  • 调用 JavaScript window.open() 方法时存在一些限制。有关详细信息,请参阅调用 JavaScript window.open() 方法的限制

  • 远程(网络)安全沙箱中的 HTML 内容只能从远程域(网络 URL)加载 CSS、frameiframeimg 内容。

  • 只能与本地文件系统内容交互的沙箱、只能与远程内容交互的沙箱或受信任的本地沙箱中的 HTML 内容只能从本地沙箱(而不是应用程序或网络 URL)加载 CSS、frameiframeimg 内容。

有关详细信息,请参阅对不同沙箱中的内容的代码限制

设置本地 SWF 文件的沙箱类型

最终用户或计算机管理员可以指定某个本地 SWF 文件是受信任的,以允许该文件从所有域(本地和网络)加载数据。这一点在“全局 Flash Player 信任”目录和“用户 Flash Player 信任”目录中指定。有关详细信息,请参阅管理员控制用户控制

有关本地沙箱的详细信息,请参阅本地沙箱

Adobe Flash Professional

通过在创作工具中设置文档发布设置,您可以将 SWF 文件配置在只能与本地文件系统内容交互的沙箱或只能与远程内容交互的沙箱中。

Adobe Flex

通过在 Adobe Flex 编译器中设置 use-network 标志,您可以配置只能与本地文件系统内容交互的沙箱或只能与远程内容交互的沙箱的 SWF 文件。有关详细信息,请参阅《构建和部署 Adobe Flex 3 应用程序》中的“关于应用程序编译器选项”。

Security.sandboxType 属性

SWF 文件的作者可使用只读静态 Security.sandboxType 属性确定 Flash Player 或 AIR 运行时已向其分配 SWF 文件的沙箱类型。Security 类包括表示 Security.sandboxType 属性可能值的常量,如下所示:

  • Security.REMOTE — SWF 文件来自 Internet URL,并遵守基于域的沙箱规则。

  • Security.LOCAL_WITH_FILE — SWF 文件是本地文件,但尚未受到用户信任,且没有使用网络名称进行发布。此 SWF 文件可以从本地数据源读取数据,但无法与 Internet 进行通信。

  • Security.LOCAL_WITH_NETWORK — SWF 文件是本地文件,且尚未受到用户信任,但已使用网络名称进行发布。此 SWF 文件可与 Internet 通信,但不能从本地数据源读取数据。

  • Security.LOCAL_TRUSTED — SWF 文件是本地文件,且已使用“设置管理器”或 Flash Player 信任配置文件受到用户信任。此 SWF 文件既可以从本地数据源读取数据,也可以与 Internet 进行通信。

  • Security.APPLICATION — SWF 文件在 AIR 应用程序中运行,并且随该应用程序的包(AIR 文件)一起安装。默认情况下,AIR 应用程序沙箱中的文件可以跨脚本访问任何域中的任何文件。但是,AIR 应用程序沙箱以外的文件不会获许跨脚本访问 AIR 文件。默认情况下,AIR 应用程序沙箱中的文件可以加载任何域中的内容和数据。