第28章Flash网络应用程序沙箱安全和部署使用Flash开发的网络应用程序必须十分注意应用程序的安全,为此,FlashPlayer建立了严格的沙箱,该沙箱根据资源的拥有者来限制网络应用程序要加载的资源,这是最基本的安全原理。注意,这个沙箱是位于客户端的沙箱,它用于过滤客户端所要执行的资源,这是一个最基本的理解沙箱的基础。28.1资源的拥有者在网络上,每一个资源都有自己的拥有者,拥有这些资源的用户可以对其自己的资源进行控制(安全设置)。一般来说,每种资源有4个持有者。FlashPlayer对这些控制严格采用一种权利层次结构,如图28-1所示。图28-1安全控制层次结构首先是客户端的管理员,他可以使用“全局FlashPlayer信任”目录来设置计算机的权限,然后是“用户FlashPlayer信任”目录来设置用户自己的权限。客户端管理员设置用户设置网站设置作者设置第28章Flash网络应用程序沙箱安全和部署733如果要加载网站上的资源,则网站管理员会使用策略文件加以限制。最后,要加载某个SWF文件,则该文件的创作者也可以设置该文件的权限,以定义是否允许被加载。28.2安全沙箱客户端计算机中的FlashPlayer可以从很多来源(如外部Web站点或本地文件系统)中获取SWF文件。当SWF文件及其他资源(如共享对象、位图、声音、视频和数据文件)被加载到FlashPlayer中时,FlashPlayer会根据这些文件和资源的来源单独地将其分配到安全沙箱中。有两个基本的沙箱类型:远程沙箱和本地沙箱,其中本地沙箱还可以被细分为3个沙箱类型。28.2.1远程沙箱FlashPlayer将来自Internet的资源(包括SWF文件)分类到单独的沙箱中,这些沙箱与各自Web站点原始域相对应。默认情况下,对这些文件授予访问其自身所在服务器中任何资源的权限。如果要访问其他域中的资源,必须获得Web站点的许可(通过“跨域策略文件”)和创作者的许可(通过Security.allowDomain方法)。28.2.2本地沙箱远程SWF文件无法加载任何本地文件或资源,但本地SWF文件却有可能既能加载本地文件或资源,也能加载来自Internet的资源。“本地文件”是指通过使用file协议或统一命名约定(UNC)路径引用的任何文件。本地SWF文件被放置在3个本地沙箱中的一个内。(1)只能与本地文件系统内容交互的沙箱。出于安全性考虑,FlashPlayer在默认情况下将所有本地SWF文件和资源放置在只能与本地文件系统内容交互的沙箱中。通过此沙箱,SWF文件可以读取本地文件(例如通过使用URLLoader类),但是它们无法以任何方式与网络进行通信。这样,可向用户保证本地数据不会泄漏到网络或以其他方式不适当地共享。(2)只能与远程内容交互的沙箱。编译SWF文件时,可以指定该文件作为本地文件运行时拥有网络访问权限。这些文件放置在只能与远程内容交互的沙箱中。分配到只能与远程内容交互的沙箱中的SWF文件将失去其本地文件访问权第四篇模块、大规模应用、部署篇734限,但允许这些SWF文件访问网络中的数据。不过,只有通过跨域策略文件或调用Security.allowDomain()方法来授予操作权限,才允许远程内容交互的SWF文件读取源自网络的数据。为授予此类权限,跨域策略文件必须向“所有”域授予权限,方法是使用allow-access-fromdomain=*/或使用Security.allowDomain(*)。(3)受信任的本地沙箱。注册为受信任(由用户或安装程序注册)的本地SWF文件放置在受信任的本地沙箱中。系统管理员和用户还可以根据安全注意事项将本地SWF文件重新分配(移动)到受信任的本地沙箱,或者从该沙箱中进行重新分配。分配到受信任的本地沙箱的SWF文件可以与其他任何SWF文件交互,也可以从任何位置(远程或本地)加载数据。只能与远程内容交互的沙箱和只能与本地文件系统内容交互的沙箱之间的通信以及只能与本地文件系统内容交互的沙箱和远程沙箱之间的通信是严格禁止的。Flash应用程序或用户/管理员不能授予允许此类通信的权限。在本地HTML文件和本地SWF文件之间以任一方向访问脚本(例如使用ExternalInterface类)均要求涉及的HTML文件和SWF文件应位于受信任的本地沙箱中。这是因为浏览器的本地安全模型与FlashPlayer本地安全模型不同。只能与远程内容交互的沙箱中的SWF文件无法加载只能与本地文件系统内容交互的沙箱中的SWF文件。只能与本地文件系统内容交互的沙箱中的SWF文件无法加载只能与远程内容交互的沙箱中的SWF文件。28.2.3设置本地SWF文件的沙箱类型使用Flash创作工具的发布设置对话框可以配置本地SWF文件的沙箱类型。选择“文件发布设置”命令,弹出“发布设置”对话框,单击“Flash”选项卡,可以看到如图28-2所示的发布设置。图28-2发布设置在“本地回放安全性”下拉列表中选择“只访问网络”选项,则表示将创建的SWF文件设置为只能与远程内容交互的沙箱;选择“只访问本地文件”选项,则表示将创建的SWF文件设置为本地文件系统内容交互的沙箱。最终用户或计算机管理员可以指定某个本地SWF文件是受信任的,这样就可以将SWF文件设置在受信任的本地沙箱中,从而允许该SWF文件既可以加载本地资源也可以从所有远程域加载数据。要实现这一点,可以在“全局Flash第28章Flash网络应用程序沙箱安全和部署735Player信任”目录和“用户FlashPlayer信任”目录中指定。(1)“全局FlashPlayer信任”目录。SWF文件可以在“全局FlashPlayer信任”目录中被指定为受信任,该目录如下。[01]Windows系统:system\Macromed\Flash\FlashPlayerTrust例如C:\windows\system32\Macromed\Flash\FlashPlayerTrust[02]Mac系统:appsupport/Macromedia/FlashPlayerTrust例如/Library/ApplicationSupport/Macromedia/FlashPlayerTrust(2)“用户FlashPlayer信任”目录。也可以在“用户FlashPlayer信任”目录中将文件指定为受信任,但这些设置只会影响当前用户,不会影响登录到计算机的其他用户,该目录如下。[01]Windows系统:appdata\Macromedia\FlashPlayer\#Security\FlashPlayerTrust例如C:\DocumentsandSettings\用户名\ApplicationData\Macromedia\FlashPlayer\#Security\FlashPlayerTrust[02]Mac系统:appdata/Macromedia/FlashPlayer/#Security/FlashPlayerTrust例如/Users/用户名/Library/Preferences/Macromedia/FlashPlayer/#Security/FlashPlayerTrust“用户FlashPlayer信任”和“全局FlashPlayer信任”目录可以包含任意数目的文本文件,每个文件均列出受信任的路径,一个路径占一行。每个路径可以是单个的SWF文件、HTML文件,也可以是目录,注释行以#号开头。例如,以下文本表示将向一个指定目录及所有子目录中的所有SWF文件授予受信任。#信任一个文件夹:E:\flashApp\SampleApp以下文本表示将向几个SWF文件授予受信任。#信任一个文件:E:\SampleApp.swfE:\SampleApp2.swf信任配置文件中列出的路径应始终是本地路径或SMB网络路径,任何HTTP路径均会被忽略(只能信任本地文件)。为避免发生冲突,最好为每个信任配置文件指定一个与安装应用程序相应的文件名,并且使用.cfg文件扩展名。第四篇模块、大规模应用、部署篇736在通过安装应用程序分发本地运行的SWF文件时,可以让安装应用程序向“用户FlashPlayer信任”或“全局FlashPlayer信任”目录添加一个配置文件,为要分发的文件授予访问权限(沙箱类型)。(3)FlashPlayer设置对话框和设置管理器。也可以使用“AdobeFlashPlayer设置”对话框和“设置管理器”来设置本地文件的用户信任,这实际是改变“用户FlashPlayer信任”目录。在FlashPlayer运行时右击,在弹出的快捷菜单上选择“设置”选项,弹出“设置”对话框,保密性设置如图28-3所示。单击“保密性”选项卡,在该选项卡上单击“高级”按钮,就可以在网页中打开“设置管理器”。“设置管理器”显示一个更详细的界面,并提供全局更改功能,全局更改可影响对许多域或所有域拥有的权限。另外,当SWF文件请求新的权限,要求有关安全或隐私的运行时决策时,程序会显示一些对话框,用户可以在这些对话框中调整某些FlashPlayer设置。其中,有一个“全局安全设置”选项卡用来设置信任目录和信任SWF文件,如图28-4所示。图28-3保密性设置图28-4“全局安全设置”选项卡28.2.4使用Security.sandboxType属性判断沙箱类型SWF文件的作者可以使用只读的Security.sandboxType静态属性来确定FlashPlayer向其分配该SWF文件的沙箱类型。Security类包括表示Security.sandboxType属性可能值的常量,有以下几种类型。lSecurity.REMOTE:表示SWF文件来自InternetURL,并遵守基于域的沙箱规则。lSecurity.LOCAL_WITH_FILE:表示SWF文件是本地文件,但尚未受到用户信任,且没有使用网络名称进行发布。此SWF文件可以从本地数据源读取数据,但无法与Internet进行通信。第28章Flash网络应用程序沙箱安全和部署737lSecurity.LOCAL_WITH_NETWORK:表示SWF文件是本地文件,且尚未受到用户信任,但已使用网络名称进行发布。此SWF文件可与Internet通信,但不能从本地数据源读取数据。lSecurity.LOCAL_TRUSTED:表示SWF文件是本地文件,且已使用“设置管理器”或FlashPlayer信任配置文件受到用户信任。此SWF文件既可以从本地数据源读取数据,也可以与Internet进行通信。28.3使用跨域策略文件无论是本地沙箱的SWF文件(“只能与远程内容交互的沙箱”和“受信任的本地沙箱”)还是远程沙箱的SWF文件,要加载Web服务器上的资源都必须遵守一定的策略。受影响的资源包括以下几个方面。l位图、声音和视频,以及声音和视频中的数据。lXML文件和文本文件。l对Socket和XMLSocket连接的访问。lSWF文件。28.3.1Web服务器跨域策略文件默认情况下,位于Web服务器上的SWF文件仅可以从相同的域中加载资源,相同的域意味着主机名与域名都必须精确匹配。虽然域总是对应一个IP地址,但域名及其对应的IP地址不能算是相同的域,FlashPlayer不执行DNS解析。并且,同一主域的不同主机之间也不能算是相同的域。例如,以下两个主机不能算是相同的域。如果要加载来自不同域的资源,可以在目标服务器上创建一个跨域策略文件。“跨域策略文件”是一个XML文件,它指示该服务器上的数据和文档可用于来自某些域或所有域的SWF文件加载。假定一个位于,那么用户必须在文件,输入以下代码。?xmlv