Flash Player 8 中的安全性更改
本地沙箱
本节描述放置 SWF 的各种本地沙箱。
权限
Flash Player 为本地文件定义了以下权限类型:
-
本地读取。该权限适用于供文件系统使用的本地 SWF, 但不适用于供网络使用的本地 SWF。它包括将数据从外部文件加载到 ActionScript 变量的操作, 此处的数据来自位于本地文件系统中的文件。本地 URL 形式的示例在前面的“什么受到影响”一节中给出。受影响的数据加载操作如下所示:
- XML.load、XML.sendAndLoad
- LoadVars.load、LoadVars.sendAndLoad、loadVariables、loadVariablesNum、MovieClip.loadVariables
- 从另一个 SWF 库中导入元件
-
网络发送。该权限适用于供网络使用的本地 SWF, 但不适用于供本地文件系统使用的本地 SWF。该权限包括将数据或请求发送到 Internet 位置或 HTTP 服务器的操作。这包括以下所有与非本地 URL 一起使用的操作:
- XML.load、XML.send、XML.sendAndLoad
- LoadVars.load、LoadVars.send、LoadVars.sendAndLoad、loadVariables、loadVariablesNum、MovieClip.loadVariables
- XMLSocket.connect
- NetConnection.call (Flash Remoting)
- 从另一个 SWF 库中导入元件
- getURL、MovieClip.getURL
- loadMovie、loadMovieNum、MovieClip.loadMovie、MovieClipLoader.loadClip
- Sound.loadSound
-
网络读取。供网络使用的本地 SWF 可执行网络发送操作。一些网络发送操作属于单向操作, 仅发送数据而不返回答复;但其它网络发送操作是能够收到回复的请求。后一种操作称为网络读取 操作 - 即网络发送操作的超集。虽然需要从数据的原始域获得权限, 但是供网络使用的本地 SWF 仍会尝试网络读取操作。以下是使用非本地 URL 的操作:
- XML.load、XML.sendAndLoad
- LoadVars.load、LoadVars.sendAndLoad、loadVariables、loadVariablesNum、MovieClip.loadVariables
- XMLSocket.connect
- NetConnection.call (Flash Remoting)
- 从另一个 SWF 库中导入元件
-
SWF-HTML。这包括允许 SWF 文件处理 HTML 文件脚本的操作, 反之亦然。由于 Flash Player 和网页浏览器之间的安全模式可能不匹配, 因此在三个本地沙箱中只有受信任的本地文件具有 SWF-HTML 权限。这些操作包括:
-
SWF 到 HTML 的操作:
fscommand
getURL("javascript:...")
ExternalInterface.call
-
HTML 到 SWF 的操作:
JavaScript API* (SetVariable、GotoFrame 等)
调用使用 ExternalInterface.addCallback 建立的回调
-
将 SWF 选入供网络使用的本地沙箱
如果此沙箱包含称为 UseNetwork 的标记, 那么本地 SWF 将会放置在该沙箱中。虽然该标记只对 Flash Player 8 和更高版本有意义, 但是该标记仍然可以放置在任何版本的 SWF 中。该标记可以使用两种方式之一建立:
-
当从 Flash 8 发布时, 在“发布设置”对话框中, 选择 Flash 选项卡, 在底部找到“本地回放安全性”选项, 并选择“只访问网络” (见图 1)。
图 1. 设置只访问网络的本地回放安全性
- 如果您没有 Flash 8 或想要在发布后使用 SWF 工作, 您不必重新发布它们, 而可以使用 Flash Local Content Updater, 它是 macromedia.com 上可供下载的 免费命令行实用工具。Local Content Updater 可添加、删除或检查在一个或多个 SWF 上操作的 UseNetwork 标记。Local Content Updater 可用于 Windows、Mac OS X 和 Linux, 并且也可作为源代码使用。
注 意, UseNetwork 标记不会影响通过 HTTP 加载的 SWF (这些标记始终放在远程沙箱中)或者放置在用户信任的本地沙箱中的 SWF (它们始终放在受信任的本地沙箱中)。UseNetwork 标记只影响以其它方式放置在供文件系统使用的本地沙箱中的 SWF。
将文件配置到受信任的本地沙箱
如 果某本地 SWF (或 HTML 文件)放置在用户的本地配置中指定为受信任的本地路径下, 那么该本地 SWF (或 HTML 文件)将放置在该沙箱中。如果到单独文件的路径或目录是可信任的, 那么每个所选目录和及其任何子目录的所有文件都是可信任的。信任指派可通过两种方式完成:
-
设置管理器。用户可以访问设置管理器的安全面板并且手动添加、编辑或删除列表中受信任的路径 (见图 2)。
图 2. Flash Player 设置管理器中的安全设置
-
用户也可能使用该面板中的“询问/允许/拒绝”选项做出 Flash Player 如何处理旧的 SWF (版本 7 和更低版本的供本地文件系统使用的 SWF)的全局决定。这里的默认值是“询问”, 除了显示警告对话框外, 它将放弃任何已禁止的操作。改为选择“始终允许”将允许已禁止的操作继续进行, 因而回复到 Flash Player 7 的默认行为。但是, 该设置不会影响版本 8 或更高版本的 SWF, 它只会影响在较新的本地规则产生前已开发的内容。选择“始终拒绝”会导致所有已禁止的操作失败, 且不显示对话框。
注意: 询问/允许/拒绝选项不仅管理本地安全提示情形, 而且管理自 Flash Player 7 以来出现的精确域匹配*提示情形。
-
FlashPlayerTrust 配置文件。这些是列出受信任路径的简单文本文件。这些文件由可执行的安装程 序创建。当安装程序将 SWF 安装到用户的计算机时, 它能够安装信任的配置文件并指定 SWF 是受信任的。当该做法没有表现用户显式决定每个受信任的 SWF 时, 该用户已通过运行安装程序将信任隐式给予它, 毕竟它是可执行程序。Flash Player 可识别以下两个位置的信任配置文件: 影响计算机所有用户的位置和只影响当前用户的位置。所有用户位置需要操作系统级别的管理权限。这些位置如下:
-
Windows 所有用户:
<系统 › \Macromed\Flash\FlashPlayerTrust
(例如 c:\WINNT\system32\Macromed\Flash\FlashPlayerTrust)
-
Windows 单个用户:
<应用程序数据 › \Macromedia\Flash Player\#Security\FlashPlayerTrust
(例如 c:\Documents and Settings\fred\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust)
-
Mac OS 所有用户:
<应用程序支持 › /Macromedia/FlashPlayerTrust
(例如 /Library/Application Support/Macromedia/FlashPlayerTrust)
-
Mac OS 单个用户:
<应用程序数据 › /Macromedia/Flash Player/#Security/FlashPlayerTrust
(例如 /Users/fred/Library/Preferences/Macromedia/Flash Player/#Security/FlashPlayerTrust)
-
这 些位置是目录, 不是单个文件。可以将任意数目的配置文件安装在这些目录中;Flash Player 将读取查找到的所有文件。不能将配置文件放置在 FlashPlayerTrust 的子目录中;必须直接放在 FlashPlayerTrust 目录中。可以任意命名独立配置文件, 为避免命名冲突, 安装程序应以特定于产品的方式命名这些配置文件。FlashPlayerTrust 目录不一定在任何给定系统中都存在, 因此安装程序需要创建它们。
这些文件的语法很简单: 它们包含任意数量的本地路径, 每行一个。允许空格和空行。可以包含带有 # 字符的注释;这些注释位于一行的末尾。对于包含空格的路径, 不需要使用引号 (否则会导致问题)。
这 些文件包含文件系统路径, 它们在一些用户的计算机上可能包含非 ASCII 字符, 因此在 FlashPlayerTrust 文件中使用的文本编码很重要。Flash Player 将在这些文件的开始处查找 Unicode 字节顺序的标记字符, 并识别 UTF-8 和 UTF-16 字节顺序标记, 并相应地将其余的文件视为 UTF-8 或 UTF-16。 (例如 Windows Notepad 和 Mac TextEdit 可以写入包含这些字节顺序标记字符的 Unicode 文本文件;许多其它文本编辑器也可以。)如果 Flash Player 在 FlashPlayerTrust 文件开始处未找到字节顺序的标记字符, 它将使用计算机的当前“代码页” (默认为本地编码)解释文件。
HTML 沙箱
我 们通常提到放置在沙箱中的 SWF, 为了控制 SWF-HTML 交互操作, Flash Player 同样将 HTML 文件放置在沙箱中。本地 HTML 文件只有两个沙箱: 受信任沙箱和不受信任沙箱。默认情况下, 本地 HTML 文件是不可信的, 并可以采用与 SWF 相同的方式指定为受信任的。本地 HTML 文件的沙箱只对 HTML-to-SWF 的脚本处理重要 (如使用 Flash Player JavaScript API)。
确定 SWF 的沙箱
使用以下只读 ActionScript 属性, SWF 可确定自己的沙箱类型:
System.security.sandboxType
该属性具有下列四种字符串值之一:
- "remote"
- "localWithFile"
- "localWithNetwork"
- "localTrusted"
供文件系统使用的本地沙箱行为
供本地文件系统使用的沙箱中的 SWF 可执行本地读取操作, 但是不会执行网络发送或 SWF-HTML 操作。
如果使用 Flash Player 的调试版本, 并连接到 Macromedia Flash 中的调试器, 则当此沙箱中的 SWF 尝试某个已禁止的操作时, 您将在描述失败操作的输出面板上看到诊断信息。
当用户播放此沙箱中发布版本为 7 或更早版本的 SWF, 并且 SWF 尝试某个已禁止的操作时, 将会显示一个安全警告对话框, 指示由于 Flash Player 8 的本地安全规则的更改, 内容可能已经如期停止工作 (见图 3)。
图 3. 提醒用户操作已停止的安全对话框
每次运行程序时, 此对话框最多出现一次, 后续操作将不会触发它, 而是在没有任何提示的情况下失败。
无论用户在对话框中采取什么操作, 尝试的操作都将失败。但是, 如果用户单击“设置”按钮, 将打开一个显示设置管理器的新窗口, 此处用户可选择信任那些尝试已禁止操作的本地内容。如果用户选择“设置管理器”中的“添加位置”命令, 并在短时间内查看图 2 中的“Flash Player 设置管理器”, 就会显示曾经尝试已禁止操作的本地 SWF 路径的提示 (见图 4)。
图 4.使用“tip”提示指定受信任位置
用户可选择仅将该路径复制到“信任此位置”文本框, 从而信任可触发此对话框的单个 SWF。有时候这就足够了;但是, 有时某个应用程序是由多个文件组成的, 并且为了使应用程序如期运行, 有必要信任多个文件。 (请参见后面介绍协作介质的部分。)因此, 用户必须试验信任多个文件或包含可触发此对话框的 SWF 的完整目录。
如果用户在“设置管理器”中进行更改, 在更改生效前, 就必须重新启动原始应用程序 (通常通过刷新浏览器)。
围绕设置管理器的安全面板的文档向最终用户解释了以上工作流程。要获得有关信任本地内容的分步说明, 用户也可以访问技术说明: 如何让本地 Flash 内容与 Internet 通信?*。
FlashAuthor.cfg
对于最终用户, 本地安全警告对话框只对版本 7 和更早版本的 SWF 显示。此对话框可让用户修复受新的本地安全性规则影响的 Flash 8 以前的内容。
但是, 对于 Flash 内容的作者, 安全警告对话框可能是失败原因的有用指示器。无论任何版本的 SWF 尝试被本地安全规则禁止的操作时, 作者都希望立即得到通知。
为了支持这种需要, 各种 Macromedia 创作工具 (包括 Macromedia Flash 8)都安装了一个称作 FlashAuthor.cfg 的文件, 指示当由任何供本地文件系统使用的 SWF (无论任何版本)执行被禁止的操作时 Flash Player 将显示警告对话框。而且任何用户都可以自由创建这个文件。可以将该文件放置在以下两个位置中的任何一个, 每个位置都与 FlashPlayerTrust 目录平级:
-
Windows 所有用户:
<系统 › \Macromed\Flash\FlashAuthor.cfg
(例如 c:\WINNT\system32\Macromed\Flash\FlashAuthor.cfg)
-
Windows 单个用户:
<应用程序数据 › \Macromedia\Flash Player\#Security\FlashAuthor.cfg
(例如 c:\Documents and Settings\fred\Application Data\Macromedia\Flash Player\#Security\FlashAuthor.cfg)
-
Mac OS 所有用户:
<应用程序支持 › /Macromedia/FlashAuthor.cfg
(例如 /Library/Application Support/Macromedia/FlashAuthor.cfg)
-
Mac OS 单个用户:
<应用程序数据 › /Macromedia/Flash Player/#Security/FlashAuthor.cfg
(例如 /Users/fred/Library/Preferences/Macromedia/Flash Player/#Security/FlashAuthor.cfg)
此文件中当前只有一个可识别指令:
LocalSecurityPrompt=Author
当决定是否在图 3 中显示警告对话框时, 该指令可导致 Flash Player 忽略 SWF 版本。
FlashAuthor.cfg 还可包括空格和通过 # 字符指示的注释, 注释一直延伸至行的末尾。
如果您要开发作为本地文件播放的 SWF 内容, LocalSecurityPrompt=Author
指令可能不符合您的需要, 因为它阻止 Flash Player 完全模拟最终用户的行为。您可以通过将 FlashAuthor.cfg to 内容更改为除上面所示的 LocalSecurityPrompt=Author
以外的任何内容来禁用作者指定的行为。例如, 您可以注释掉上面的行, 或者将它更改为容易理解的内容, 如:
LocalSecurityPrompt=User
注意, Macromedia Flash 8 将在所有用户和单个用户两个位置安装 FlashAuthor.cfg。当两个位置都显示 FlashAuthor.cfg 时, Flash Player 将在单个用户位置兑现副本, 因此确保要编辑单个用户文件。
供网络使用的本地沙箱行为
供网络使用的本地沙箱中的 SWF 可执行网络发送操作, 但是不能执行本地读取或 SWF-HTML 操作。
如果使用 Flash Player 的调试版本, 并连接到 Flash 中的调试器, 则当此沙箱中的 SWF 尝试某个已禁止的操作时, 您将在描述失败操作的输出面板上看到诊断信息。
此沙箱中的 SWF 不会引起安全警告对话框的显示, 因为在本地安全规则更改前, 不存在已生成内容, 而是依然存在于供网络使用的本地沙箱中。从最终用户的角度看, 此沙箱中所有已禁止的操作都将失败且无任何提示。
供网络使用的本地 SWF 可执行网络发送操作。一些网络发送操作属于单向操作, 仅发送数据而不返回答复;但其它网络发送操作是能够收到回复的请求。后一种操作称为网络读取 操作 - 即网络发送操作的超集。网络读取操作的一个示例是 XML.load("http://mysite.com/data/schedule.xml")。允许供网络使用的本地 SWF 尝试网络读取操作。但是, 为遵守 Flash Player 的全局权限原则, 以便供网络使用的本地 SWF 可以从给定域中加载数据, 该域必须提供一个策略文件*, 该文件授权所有域读取相关数据和声明 <allow-access-from domain="*" / ›
。在以上示例中, mysite.com 需要位于默认位置 (http://mysite.com/crossdomain.xml) 或靠近所需数据 (http://mysite.com/data/crossdomain.xml) 的策略文件。在后一种情况中, 为了通知 Flash Player 非默认的策略文件位置, 加载的 SWF 需要调用以下文件:
System.security.loadPolicyFile("http://mysite.com/data/crossdomain.xml")