在 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 形式 (只列出其中一部分)的示例:
存在很多不同的 Flash Player 类型, 并且每种类型都会在不同的环境下受到影响。
在 Flash Player 8 中, 所有 SWF (以及 HTML 文件,用于 SWF-HTML 脚本处理)都放在以下四类沙箱之一中:
查看描述本地安全的图表附录对此会很有帮助 (请参见本地安全示意图*一节)。
如果本地 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("*") 可以解决所有安全问题, 这样做会牺牲掉内容所需的保护!请在每次授予全局权限时考虑一下这样做的后果。