权限控制

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

Flash Player 客户端运行时安全模型是围绕 SWF 文件、本地数据和 Internet URL 等这些对象资源设计而成的模型。 “资源持有者”是指拥有或使用这些资源的各方。 资源持有者可以对其自己的资源进行控制(安全设置),每种资源有四个持有者。Flash Player 对这些控制严格采用一种权利层次,如下图所示:

权利层次
安全控制层次

该图说明,如果管理员限制对资源的访问,则任何持有者都不能覆盖该限制。

对于 AIR 应用程序,这些权限控制只适用于在 AIR 应用程序沙箱外运行的内容。

管理员控制

计算机的管理用户(使用管理权限登录的用户)可以应用能影响计算机所有用户的 Flash Player 安全设置。在非企业环境(例如家庭计算机)中,通常只有一个用户,该用户也拥有管理访问权限。即使是在企业环境中,单个用户也可以拥有计算机管理权限。

管理用户控制有两种类型:

  • mms.cfg 文件

  • “全局 Flash Player 信任”目录

mms.cfg 文件

mms.cfg 文件是一个文本文件,由管理员用于启用或限制用户对各种功能的访问。Flash Player 启动时,将从此文件中读取其安全设置,然后使用这些设置限制功能。mms.cfg 文件包含管理员用于管理隐私控制、本地文件安全性、套接字连接等功能。

SWF 文件可通过调用 Capabilities.avHardwareDisable Capabilities.localFileReadDisable 属性来访问已禁用功能的某些信息。但是,mms.cfg 文件中的大部分设置无法通过 ActionScript 进行查询。

为对计算机强制执行与应用程序无关的安全和隐私策略,只能由系统管理员修改 mms.cfg 文件。mms.cfg 文件不能用于安装应用程序。虽然使用管理权限运行的安装程序可以修改 mms.cfg 文件的内容,但是 Adobe 将此类使用视为违反用户的信任,并且劝告安装程序的创建者决不要修改 mms.cfg 文件。

mms.cfg 文件存储在以下位置:

  • Windows: system \Macromed\Flash\mms.cfg

    (例如,C:\WINDOWS\system32\Macromed\Flash\mms.cfg)

  • Mac: app support /Macromedia/mms.cfg

    (例如,/Library/Application Support/Macromedia/mms.cfg)

有关 mms.cfg 文件的详细信息,请参阅《Flash Player 管理指南》,网址为 www.adobe.com/go/flash_player_admin_cn。

“全局 Flash Player 信任”目录

管理用户和安装应用程序可以针对所有用户将指定的本地 SWF 文件注册为受信任。这些 SWF 文件会被分配到受信任的本地沙箱。它们可以与任何其他 SWF 文件进行交互,也可以从任意位置(远程或本地)加载数据。文件在“全局 Flash Player 信任”目录中被指定为受信任,位置如下:

  • Windows: system \Macromed\Flash\FlashPlayerTrust

    (例如,C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust)

  • Mac: app support /Macromedia/FlashPlayerTrust

    (例如,/Library/Application Support/Macromedia/FlashPlayerTrust)

“Flash Player 信任”目录可以包含任意数目的文本文件,每个文件均列出受信任的路径,一个路径占一行。每个路径可以是单个的 SWF 文件、HTML 文件,也可以是目录。注释行以 # 号开头。例如,包含以下文本的 Flash Player 信任配置文件表示将向指定目录及所有子目录中的所有文件授予受信任状态:

# Trust files in the following directories: 
C:\Documents and Settings\All Users\Documents\SampleApp

信任配置文件中列出的路径应始终是本地路径或 SMB 网络路径。信任配置文件中的任何 HTTP 路径均会被忽略;只能信任本地文件。

为避免发生冲突,应为每个信任配置文件指定一个与安装应用程序相应的文件名,并且使用 .cfg 文件扩展名。

由于开发人员通过安装应用程序分发本地运行的 SWF 文件,因此可以让安装应用程序向“全局 Flash Player 信任”目录添加一个配置文件,为要分发的文件授予完全访问权限。安装应用程序必须由拥有管理权限的用户来运行。与 mms.cfg 文件不同,包含“全局 Flash Player 信任”目录是为了让安装应用程序授予信任权限。管理用户和安装应用程序都可以使用“全局 Flash Player 信任”目录指定受信任的本地应用程序。

此外,还有适用于单个用户的“Flash Player 信任”目录(请参阅下一节 用户控制 )。

用户控制

Flash Player 提供三种不同的用户级别权限设置机制:“设置 UI”、“设置管理器”和“用户 Flash Player 信任”目录。

设置 UI 和设置管理器

“设置 UI”是一种用于配置特定域设置的快速交互机制。“设置管理器”显示一个更详细的界面,并提供全局更改功能,全局更改可影响对许多域或所有域拥有的权限。另外,当 SWF 文件请求新的权限,要求有关安全或隐私的运行时决策时,程序会显示一些对话框,用户可以在这些对话框中调整某些 Flash Player 设置。

设置管理器和设置 UI 提供了与安全相关的选项,如摄像机和麦克风设置、共享对象存储设置、与旧内容相关的设置等。设置管理器和设置 UI 在 AIR 应用程序中都不可用。

注: 在 mms.cfg 文件中所进行的任何设置(请参阅 管理员控制 )都不会反映在设置管理器中。

有关设置管理器的详细信息,请访问 www.adobe.com/go/settingsmanager_cn

“用户 Flash Player 信任”目录

用户和安装应用程序可以将指定的本地 SWF 文件注册为受信任。这些 SWF 文件会被分配到受信任的本地沙箱。它们可以与任何其他 SWF 文件进行交互,也可以从任意位置(远程或本地)加载数据。用户在“用户 Player 信任”目录中将文件指定为受信任,该目录与 Flash 共享对象存储区域的所在目录相同,位置(特定于当前用户)如下:

  • Windows:app data\Macromedia\Flash Player\#Security\FlashPlayerTrust

    (例如,在 Windows XP 上:C:\Documents and Settings\JohnD\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust,在 Windows Vista 上:C:\Users\JohnD\AppData\Roaming\Macromedia\Flash Player\#Security\FlashPlayerTrust)

    在 Windows 中,Application Data 默认为隐藏状态。若要显示隐藏的文件夹和文件,请选择“我的电脑”打开 Windows 资源管理器,选择“工具”>“文件夹选项”,然后选择“查看”选项卡。在“查看”选项卡之下,选择“显示所有文件和文件夹”单选按钮。

  • Mac:app data/Macromedia/Flash Player/#Security/FlashPlayerTrust

    (例如,/Users/JohnD/Library/Preferences/Macromedia/Flash Player/#Security/FlashPlayerTrust)

    这些设置只会影响当前用户,不会影响登录到计算机的其他用户。如果没有管理权限的用户在属于他们自己的系统中安装了某个应用程序,则“用户 Flash Player 信任”目录允许安装程序将该应用程序注册为该用户的受信任程序。

    由于开发人员通过安装应用程序分发本地运行的 SWF 文件,因此可以让安装应用程序向“用户 Flash Player 信任”目录添加一个配置文件,为要分发的文件授予完全访问权限。即使在这种情况下,也将“用户 Flash Player 信任”目录文件视为用户控制,原因是用户操作(安装)启动了它。

    此外,还有一个“全局 Flash Player 信任”目录,管理用户或安装程序可使用该目录为所有计算机用户注册应用程序(请参阅 管理员控制 )。

网站控制(策略文件)

要使来自 Web 服务器的数据可用于来自其他域的 SWF 文件,可以在服务器上创建一个策略文件。“策略文件”是位于服务器上特定位置的 XML 文件。

策略文件可影响对许多资源的访问,其中包括以下内容:

  • 位图、声音和视频中的数据

  • 加载 XML 和文本文件

  • 将 SWF 文件从其他安全域导入到执行加载的 SWF 文件所在的安全域

  • 对套接字和 XML 套接字连接的访问

ActionScript 对象可实例化两种不同的服务器连接:基于文档的服务器连接和套接字连接。Loader、Sound、URLLoader 和 URLStream 等 ActionScript 对象可实例化基于文档的服务器连接,这些对象均根据 URL 加载文件。ActionScript Socket 和 XMLSocket 对象进行套接字连接,这些对象操作的是数据流而非加载的文档。

由于 Flash Player 支持两种服务器连接,因此有两种策略文件 — URL 策略文件和套接字策略文件。
  • 基于文档的连接需要“URL 策略文件”。服务器通过这些文件指示其数据和文档是否可用于特定域或所有域提供的 SWF 文件。

  • 套接字连接需要“套接字策略文件”,套接字策略文件可以在较低的 TCP 套接字级别使用 Socket 类和 XMLSocket 类直接启用网络。

Flash Player 要求使用尝试的连接希望使用的协议来传输策略文件。例如,如果将策略文件放置在您的 HTTP 服务器上,则允许其他域中的 SWF 文件从该服务器(作为 HTTP 服务器)加载数据。但是,如果在同一服务器上未提供套接字策略文件,则禁止其他域的 SWF 文件在套接字级别连接到该服务器。换言之,检索策略文件的方法必须与连接方法相匹配。

策略文件的用法和语法将在本节其余部分加以概述,主要讨论为 Flash Player 10 发布的 SWF 文件的用法和语法。(在早期的 Flash Player 版本中,策略文件实现稍有不同,后续的版本加强了 Flash Player 安全性。)有关策略文件的详细信息,请参阅 Flash Player 开发人员中心主题“Flash Player 9 中策略文件的更改”,网址为 www.adobe.com/go/devnet_security_cn

在 AIR 应用程序沙箱中执行的代码不需要策略文件就可从 URL 或套接字访问数据。在非应用程序沙箱内执行的 AIR 应用程序中的代码要求使用策略文件。

主策略文件

默认情况下,Flash Player(和 AIR 应用程序沙箱以外的 AIR 内容)首先在服务器的根目录中查找名为 crossdomain.xml 的 URL 策略文件,然后在端口 843 上查找套接字策略文件。这些位置上的文件称为“主策略文件”。(对于套接字连接,Flash Player 还会在与主连接相同的端口上查找套接字策略文件。但是,在该端口上找到的策略文件并不视为主策略文件。)

除指定访问权限外,主策略文件还包含一条“元策略”语句。元策略指定哪些位置可包含策略文件。URL 策略文件的默认元策略为“master-only”,它表示 /crossdomain.xml 是服务器上唯一允许的策略文件。套接字策略文件的默认元策略为“all”,它表示主机上的任何套接字都能提供套接字策略文件。

注: 在 Flash Player 9 及更低版本中,URL 策略文件的默认元策略为“all”,它表示任何目录都可以包含策略文件。如果部署的应用程序不是从默认的 /crossdomain.xml 文件而是从其他位置加载策略文件,并且这些应用程序目前可能运行于 Flash Player 10 中,请您(或服务器管理员)务必修改主策略文件以允许其他策略文件。有关如何指定不同元策略的信息,请参阅 Flash Player 开发人员中心主题“Flash Player 9 中策略文件的更改”,网址为 www.adobe.com/go/devnet_security_cn

SWF 文件可以通过调用 Security.loadPolicyFile() 方法检索其他策略文件名或其他目录位置。但是,如果主策略文件未指定目标位置能提供策略文件,则调用 loadPolicyFile() 无效,即使该位置有策略文件。在尝试需要策略文件的任何网络操作之前,请先调用 loadPolicyFile() 。Flash Player 自动将网络请求加入队列并排在对应的策略文件尝试之后。例如,可以在调用 Security.loadPolicyFile() 之后立即进行网络操作。

在检索主策略文件时,Flash Player 会用三秒钟等待服务器响应。如果未接收到响应,Flash Player 则假定主策略文件不存在。但是,对 loadPolicyFile() 的调用没有默认超时值;Flash Player 假定调用的文件存在,在加载文件之前会一直等待。因此,如果要确保加载主策略文件,请使用 loadPolicyFile() 来明确调用主策略文件。

尽管该方法的名称是 Security.loadPolicyFile() ,如果不发出需要策略文件的网络调用,也不能加载策略文件。对 loadPolicyFile() 的调用只是告知 Flash Player 到何处查找所需的策略文件。

系统不会通知您何时启动或完成策略文件请求,也没有必要这样做。Flash Player 执行异步策略检查,自动等待连接的启动直到策略文件检索成功完成。

下面几节介绍只适用于 URL 策略文件的相关信息。有关套接字策略文件的详细信息,请参阅 连接到套接字

URL 策略文件范围

URL 策略文件仅适用于从其中加载该文件的目录及其子目录。根目录中的策略文件适用于整个服务器;而从任意子目录加载的策略文件仅适用于该目录及其子目录。

策略文件仅影响对其所在特定服务器的访问。例如,位于 https://www.adobe.com:8080/crossdomain.xml 的策略文件仅适用于在端口 8080 通过 HTTPS 对 www.adobe.com 进行的数据加载调用。

在 URL 策略文件中指定访问权限

策略文件包含单个 <cross-domain-policy> 标签,该标签又包含零个或多个 <allow-access-from> 标签。每个 <allow-access-from> 标签包含一个属性 domain ,该属性指定一个确切的 IP 地址、一个确切的域或一个通配符域(任何域)。可采用下列两种方式之一来指示通配符域:
  • 单个星号 (*),表示匹配所有域和所有 IP 地址

  • 后接后缀的星号,表示只匹配那些以指定后缀结尾的域

后缀必须以点开头。但是,带有后缀的通配符域可以匹配那些只包含后缀但不包含前导点的域。例如,xyz.com 会被看作是 *.xyz.com 的一部分。IP 域规范中不允许使用通配符。

下面的示例显示了一个 URL 策略文件,该文件允许访问源自 *.example.com、www.friendOfExample.com 和 192.0.34.166 的 SWF 文件。

<?xml version="1.0"?> 
<cross-domain-policy> 
    <allow-access-from domain="*.example.com" /> 
    <allow-access-from domain="www.friendOfExample.com" /> 
    <allow-access-from domain="192.0.34.166" /> 
</cross-domain-policy>

如果您指定了一个 IP 地址,则将只向使用 IP 语法从该 IP 地址(例如 http://65.57.83.12/flashmovie.swf)加载的 SWF 文件授予访问权限,而不向使用域名语法的 SWF 文件授予访问权限。Flash Player 不执行 DNS 解析。

您可以允许访问来自任何域的文档,如下面的示例所示:

<?xml version="1.0"?> 
<!-- http://www.foo.com/crossdomain.xml --> 
<cross-domain-policy> 
<allow-access-from domain="*" /> 
</cross-domain-policy>

每个 <allow-access-from> 标签还具有可选的 secure 属性,其默认值为 true 。如果您的策略文件在 HTTPS 服务器上,并且要允许非 HTTPS 服务器上的 SWF 文件从 HTTPS 服务器加载数据,则可以将此属性设置为 false

secure 属性设置为 false 可能会危及 HTTPS 提供的安全性。特别是将此属性设置为 false 时,会使安全内容受到电子欺骗和窃听攻击。Adobe 强烈建议不要将 secure 属性设置为 false

如果要加载的数据在 HTTPS 服务器上,但是加载数据的 SWF 文件在 HTTP 服务器上,Adobe 建议将加载数据的 SWF 文件移至 HTTPS 服务器。这样,可以使安全数据的所有副本得到 HTTPS 的保护。但是,如果决定必须将要执行加载的 SWF 文件保存在 HTTP 服务器上,则需将 secure="false" 属性添加到 <allow-access-from> 标签,如以下代码所示:

<allow-access-from domain="www.example.com" secure="false" /> 
另一种可用于允许访问权限的元素是 allow-http-request-headers-from 标签。此元素授权客户端(此客户端承载其他权限域的内容)向您的域发送用户定义的标头。 <allow-access-from> 标签授权其他域提取您域中的数据,而 allow-http-request-headers-from 标签授权其他域将数据以标头的形式发送到您的域中。在下面的示例中,任何域都可以向当前域发送 SOAPAction 标头:
<cross-domain-policy> 
    <allow-http-request-headers-from domain="*" headers="SOAPAction"/> 
</cross-domain-policy>

如果 allow-http-request-headers-from 语句存在于主策略文件中,它将应用于主机上的所有目录。否则,它只应用于包含此语句的策略文件所在的目录和子目录。

预加载策略文件

从服务器加载数据或连接到套接字是一种异步操作。Flash Player 只是等待策略文件完成下载,然后才开始主操作。但是,从图像中提取像素数据或从声音中提取采样数据是一种同步操作。必须先加载策略文件才能提取数据。加载媒体时,请指定媒体检索策略文件:

  • 使用 Loader.load() 方法时,设置 context 参数的 checkPolicyFile 属性,该参数是一个 LoaderContext 对象。

  • 使用 <img> 标签在文本字段中嵌入图像时,将 <img> 标签的 checkPolicyFile 属性设置为 "true" ,如下所示:

    <img checkPolicyFile = "true" src = "example.jpg">
  • 使用 Sound.load() 方法时,设置 context 参数的 checkPolicyFile 属性,该参数是一个 SoundLoaderContext 对象。

  • 使用 NetStream 类时,设置 NetStream 对象的 checkPolicyFile 属性。

设置上述参数时,Flash Player 首先会检查是否已经为该域下载了任何策略文件。然后,它查找服务器上默认位置中的策略文件,同时检查 <allow-access-from> 语句和是否存在元策略。最后,考虑对 Security.loadPolicyFile() 方法的所有未处理的调用,以查看它们是否在范围内。

作者(开发人员)控制

用于授予安全权限的主 ActionScript API 是 Security.allowDomain() 方法,它将向指定域中的 SWF 文件授予权限。在下面的示例中,SWF 文件向 www.example.com 域提供的 SWF 文件授予访问权限:

Security.allowDomain("www.example.com")

此方法为下列各项授予权限:

  • SWF 文件之间的跨脚本访问

  • 显示列表访问

  • 事件检测

  • 对 Stage 对象的属性和方法的完全访问权限

调用 Security.allowDomain() 方法的主要目的是为外部域中的 SWF 文件授予权限以访问调用 Security.allowDomain() 方法的 SWF 文件的脚本。有关详细信息,请参阅 跨脚本访问

如果将 IP 地址指定为 Security.allowDomain() 方法的参数,则不允许任何源自该指定 IP 地址的访问方进行访问。相反,只允许 URL 中包含该指定 IP 地址的访问方进行访问,而不允许其域名映射到该 IP 地址的访问方进行访问。例如,如果域名 www.example.com 映射到 IP 地址 192.0.34.166,则对 Security.allowDomain("192.0.34.166") 的调用不会授予对 www.example.com 的访问权限。

可以将通配符 "*" 传递给 Security.allowDomain() 方法以允许从所有域进行访问。由于这种方式会为“所有”域中的 SWF 文件授予访问执行调用的 SWF 文件的脚本的权限,因此请谨慎使用通配符 "*"

ActionScript 还包括一个权限 API,称为 Security.allowInsecureDomain() 。此方法与 Security.allowDomain() 方法的作用相同,只是从安全 HTTPS 连接提供的 SWF 文件调用时,此方法还会允许非安全协议(例如 HTTP)提供的其他 SWF 文件访问执行调用的 SWF 文件。但是,在安全协议 (HTTPS) 中的文件与非安全协议(例如 HTTP)中的文件之间执行脚本访问操作并不是一种好的安全性做法;这样做会使安全内容受到电子欺骗和窃听攻击。下面是此类攻击的作用方式:由于 Security.allowInsecureDomain() 方法允许通过 HTTP 连接提供的 SWF 文件访问安全 HTTPS 数据,因此介入 HTTP 服务器和用户之间的攻击者能够将 HTTP SWF 文件替换为它们自己的文件,这样便可访问您的 HTTPS 数据。

重要说明: 不允许在 AIR 应用程序沙箱中执行的代码调用 Security 类的 allowDomain() allowInsecureDomain() 方法。

另一种与安全性相关的重要方法是 Security.loadPolicyFile() 方法,该方法可让 Flash Player 在非标准位置检查是否存在策略文件。有关详细信息,请参阅 网站控制(策略文件)