Flash 平台安全概述

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

Flash Player 和 AIR 运行时使用的大部分安全模型以加载的 SWF 文件、HTML、介质及其他资源的原始域为基础。特定 Internet 域(例如 www.example.com)的文件中的可执行代码,始终可以访问该域的所有数据。这些资源放置在相同的安全分组中,该分组称为“安全沙箱”。(有关详细信息,请参阅安全沙箱。)

例如,SWF 文件中的 ActionScript 代码可以加载自己域中的 SWF 文件、位图、音频、文本文件及任何其他资源。此外,只要同一域中的两个 SWF 文件都是使用 ActionScript 3.0 编写的,则始终可以在这两个文件之间执行跨脚本访问操作。“跨脚本访问”是指一个文件中的代码能够访问另一个文件中的代码所定义的属性、方法和对象。

对于使用 ActionScript 3.0 编写的 SWF 文件与使用 ActionScript 早期版本编写的 SWF 文件,它们之间不支持跨脚本访问;但是,可以通过使用 LocalConnection 类在这些文件之间进行通信。另外,默认情况下,禁止 SWF 文件跨脚本访问其他域的 ActionScript 3.0 SWF 文件,也禁止其加载其他域的数据;但是可以通过在加载的 SWF 文件中调用 Security.allowDomain() 方法来授予这种访问权。有关详细信息,请参阅跨脚本访问

默认情况下,以下基本安全性规则始终适用:

  • 位于相同安全沙箱中的资源始终可以互相访问。

  • 远程沙箱的文件中的可执行代码始终不能访问本地文件和数据。

Flash Player 和 AIR 运行时认为下列域为单独域,并为其设置单独的安全沙箱:

  • http://example.com

  • http://www.example.com

  • http://store.example.com

  • https://www.example.com

  • http://192.0.34.166

即使某个命名的域(如 http://example.com)映射到特定 IP 地址(例如 http://192.0.34.166),运行时也会为其设置单独的安全沙箱。

开发人员可以使用两种基本方法为 SWF 文件授予访问权限,使之能够访问除该 SWF 文件所属沙箱之外的其他沙箱中的资源:

在 Flash Player 和 AIR 运行时安全模型中,加载内容与提取或访问数据之间存在区别。“内容”被定义为媒体,包括运行时可显示的可视化媒体、音频、视频或包含显示媒体的 SWF 文件或 HTML。“数据”被定义为只有代码才能访问的内容。内容和数据的加载方式不同。

  • 加载内容 — 可使用 Loader、Sound 和 NetStream 等类加载内容;使用 Flex 时通过 MXML 标签加载;或在 AIR 应用程序中通过 HTML 标签加载。

  • 提取数据 — 可以通过使用 Bitmap 对象、BitmapData.draw() 方法、Sound.id3 属性或者 SoundMixer.computeSpectrum() 方法从加载的媒体内容中提取数据。

  • 访问数据 — 可使用 URLStream、URLLoader、FileReference、Socket 和 XMLSocket 等类从外部文件(如 XML 文件)加载数据,从而直接对其进行访问。AIR 提供了用于加载数据的其他类,如 FileStream 和 XMLHttpRequest。

Flash Player 安全模型针对加载内容和访问数据定义了不同的规则。通常,加载内容的限制要比访问数据的限制少一些。

通常,可从任意位置加载内容(SWF 文件、位图、mp3 文件和视频),但如果内容来自加载代码或内容的域之外的域,则会将内容划分到单独的安全沙箱中。

下面是加载内容的一些限制:

  • 默认情况下,本地 SWF 文件(从非网络地址加载的文件,例如用户硬盘上的文件)会被分类到只能与本地文件系统内容交互的沙箱中。这些文件无法从网络加载内容。有关详细信息,请参阅本地沙箱

  • 实时消息传递协议 (RTMP) 服务器可以限制对内容的访问。有关详细信息,请参阅使用 RTMP 服务器传送的内容

如果加载的媒体为图像、音频或视频,则其安全沙箱之外的 SWF 文件无法访问该媒体的数据(如像素数据和声音数据),除非该 SWF 文件的域已包含在该媒体原始域的 URL 策略文件中。有关详细信息,请参阅作为数据访问加载的媒体

加载数据的其他格式包括文本文件或 XML 文件,这些文件可使用 URLLoader 对象来加载。同样,这种情况下要访问其他安全沙箱中的任何数据,必须通过原始域中的 URL 策略文件来授予权限。有关详细信息,请参阅使用 URLLoader 和 URLStream

注: 在 AIR 应用程序沙箱中执行的代码加载远程内容或数据时始终不需要策略文件。