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()
和
BitmapData.drawWithQuality()
方法、
Sound.id3
属性或者
SoundMixer.computeSpectrum()
方法从加载的媒体内容中提取数据。
drawWithQuality
方法可用于 Flash Player 11.3 和更高版本、AIR 3.3 和更高版本。
-
访问数据 — 可使用 URLStream、URLLoader、FileReference、Socket 和 XMLSocket 等类从外部文件(如 XML 文件)加载数据,从而直接对其进行访问。AIR 提供了用于加载数据的其他类,如 FileStream 和 XMLHttpRequest。
Flash Player 安全模型针对加载内容和访问数据定义了不同的规则。通常,加载内容的限制要比访问数据的限制少一些。
通常,可从任意位置加载内容(SWF 文件、位图、mp3 文件和视频),但如果内容来自加载代码或内容的域之外的域,则会将内容划分到单独的安全沙箱中。
下面是加载内容的一些限制:
如果加载的媒体为图像、音频或视频,则其安全沙箱之外的 SWF 文件无法访问该媒体的数据(如像素数据和声音数据),除非该 SWF 文件的域已包含在该媒体原始域的 URL 策略文件中。有关详细信息,请参阅
作为数据访问加载的媒体
。
加载数据的其他格式包括文本文件或 XML 文件,这些文件可使用 URLLoader 对象来加载。同样,这种情况下要访问其他安全沙箱中的任何数据,必须通过原始域中的 URL 策略文件来授予权限。有关详细信息,请参阅
使用 URLLoader 和 URLStream
。
注:
在 AIR 应用程序沙箱中执行的代码加载远程内容或数据时始终不需要策略文件。