辅助功能*

Flash 文章

 

Flash Player 8 中的安全性更改


目录

本地安全性基础知识

在 Flash Player 7 和更早版本中, 可以自由允许本地 SWF (使用本地路径从用户的文件系统加载)执行通常要受到 Flash Player 安全准则制约的大多数操作。例如, 默认情况下, 尽管只允许通过 HTTP 加载的 SWF 使用 XML.load() 从自己的原始域加载文本, 但允许 Flash Player 7 中的本地 SWF 使用 XML.load() 从任何 HTTP URL 或任何本地文件系统路径加载文本。

我们把从本地路径读取文本文件的权限称为本地读取。同时, 在 Flash Player 7 中, 所有 SWF 都有一个称为网络发送 的附加权限, 在此权限下, 通过 LoadVars.send() 执行 HTTP POST 之类的操作可以将任何数据发送到任意 Internet 位置。结合最终用户从不受信任源下载的本地 SWF 中的本地读取和网络发送, 您可以看到本地 SWF 能够采用不适当的步骤从用户计算机读取文本文件, 并将其内容发送回 Internet 上的某个位置, 所有这些都是在用户不知情的情况下进行的。

在 Flash Player 8 中, 本地 SWF 的安全规则简单摘要如下: 默认情况下, 本地 SWF 将保留本地读取权限但会丢失网络发送权限;并且不允许以任何方式与 Internet (或任意 HTTP 服务器)通信。通过在 SWF 文件中更改设置, Flash 作者能够选择让 SWF 获得网络发送权限, 并因此放弃本地读取权限。最终, 作者和用户能够配置 Flash Player, 将 SWF 提升到受信任 状态, 使其具有两种权限, 换句话说, SWF 将具有它在 Flash Player 7 中的权限。

什么将受到影响

Flash 内容是否受影响取决于两个因素: 是否为本地内容以及所执行的是哪种类型的 Flash Player。

受影响的 SWF 是那些从本地路径加载的 SWF。它包括下列 URL 形式 (只列出其中一部分)的示例:

  • c:\temp\my.swf
  • file:///c|/temp/my.swf
  • /temp/my.swf
  • file:///temp/my.swf
  • \\server\share\my.swf
  • file:////server/share/my.swf
  • 通过本地 SWF 加载的相对 URL

存在很多不同的 Flash Player 类型, 并且每种类型都会在不同的环境下受到影响。

  • 无论何时在 Web 浏览器中使用 Web 浏览器播放器 (ActiveX 控件和插件播放器), 都会强制使用本地安全规则。
  • 在非浏览器应用程序中使用时, Web 浏览器播放器不会总是强制使用本地安全规则。如果您使用的是一个在其中嵌入某个播放器的应用程序, 请参见“Flash Player 嵌入和本地安全性”一节。
  • 独立播放器强制使用本地安全规则。
  • Flash 放映文件可以由 Macromedia Flash 创作应用程序和独立播放器创建, 它不会强制使用本地安全规则。这是因为它们都是可执行应用程序, 用户通常必须谨慎对待。
  • Flash 中的创作播放器不会强制使用本地安全规则, 因为它们仅用于测试正处于开发中的内容, 不会播放网页中的内容。

沙箱类型

在 Flash Player 8 中, 所有 SWF (以及 HTML 文件,用于 SWF-HTML 脚本处理)都放在以下四类沙箱之一中:

  • 远程沙箱。来自非本地 URL 的所有文件都放在远程沙箱中。有很多此类沙箱, 对于从中加载文件的每个 Internet (或 Intranet)域都提供一个这样的沙箱。这些沙箱与 Flash Player 6 中引入的相同;在 Flash Player 8 中未作更改。
  • 供文件系统使用的本地沙箱。这是 Flash Player 8 中默认的本地文件沙箱。该沙箱中的 SWF 不能以任何方式连接 Internet (或任何 HTTP 服务器), 例如, 它们不能将 HTTP URL 传递到 loadMovie()、getURL() 或 XML.load() 中。因为在 Flash Player 7 中允许此类操作, 所以, 如果版本 7 或更早版本的 SWF 尝试连接 Internet, 而当最终用户从 Flash Player 7 升级到 Flash Player 8 后, 将会出现以前正常工作的内容可能如期关闭的情形。因此, 当版本 7 或更早版本的 SWF 尝试连接 Internet 时, Flash Player 8 将会显示一个警告对话框, 以提示用户连接 Internet 的尝试失败。警告对话框包含一个允许用户访问“设置管理器”的按钮, 在这里他们可以选择将受影响的内容提升到本地受信任状态 (请参见下文)。
  • 供网络使用的本地沙箱。此沙箱中的 SWF 可以通过 HTTP 进行通信, 但不能从本地文件系统读取。任何版本的 SWF 都可以使用 SWF 本身设置的标记选择此沙箱, 换句话说, 不需要任何用户操作就可以将 SWF 放置到此沙箱中。在 Flash 8 中, 该标记可以使用发布选项设置, 或者使用 Local Content Updater* (本地内容更新程序)设置, 后者是 macromedia.com 提供的一个免费的 SWF 后处理实用程序。
  • 受信任的本地沙箱。该沙箱不受限制。它提供与 Flash Player 7 中所有本地文件相同的打开权限。如果最终用户给出授权, 任何本地文件都可以放在该沙箱中。该授权可以有两种形式: 通过设置管理器以交互方式授权, 或通过可执行安装程序在用户计算机上创建 Flash Player 配置文件的非交互方式授权。

查看描述本地安全的图表附录对此会很有帮助 (请参见本地安全示意图*一节)。

如果本地 SWF 需要访问 Internet (或 Intranet HTTP 服务器), 有两种本地沙箱提供这种访问。供网络使用的本地沙箱更容易获得, 并且所有必需的配置可在 SWF 本身中方便地传播。受信任的本地沙箱更为强大, 它提供更大的权限, 但是通常需要花费更多努力才能获得, 并且需要独立于 SWF 本身的配置信息。在解释了本地安全规则详情后, 本文将返回到如何在这两个沙箱之间进行选择的问题。

全局权限

因为本地文件在 Flash Player 8 中不再具有不受限制的权限, 因此存在可以将 Flash 权限授予本地文件的情形。这些内容将在下一节中介绍。

通常, Flash Player 遵循要求全局权限 的原则是为了授予本地文件权限。例如, 如果远程 SWF 想要通过供网络使用的本地 SWF 允许对其自身进行脚本处理, 它必须调用 System.security.allowDomain("*"), 从而允许其它任何加载的 SWF 对它进行脚本处理。Flash Player 不会以任何方式只对本地文件授予权限;授权方必需要对所有 文件授予权限。这是因为 Flash Player 不能确定任何本地文件的来源—该文件可能来自任何地方。因此, 允许本地文件执行操作是不合适的, 除非授权方不在意文件的来源。

请不要调用 System.security.allowDomain("*"), 除非执行此操作的 SWF 不包含敏感信息。不要简单地认为调用 System.security.allowDomain("*") 可以解决所有安全问题, 这样做会牺牲掉内容所需的保护!请在每次授予全局权限时考虑一下这样做的后果。