下面的示意图对上面各节中描述的本地安全权限进行了总结。
在将 SWF 加载到 Flash Player 中时, 会将所有 SWF 放到一个沙箱中。图 5 显示了如何基于 SWF 的来源将其分配给沙箱。来自网络 (例如 a.com 和 b.com)的 SWF 始终位于和其来源域相对应的沙箱中。
图 5. 基于 SWF 来源分配的沙箱
本地来源 (本地文件系统或 UNC 网络路径)的 SWF 位于三个沙箱之一内。默认情况下, 本地 SWF 位于供文件系统使用的本地沙箱中。已声明希望访问网络的本地文件位于供网络使用的本地沙箱中。注册为受信任 (通过设置管理器或配置文件)的本地文件位于受信任的本地沙箱中。 (在 Flash Player 7 及更早版本中, 所有本地文件都位于受信任的本地沙箱中。)
在同一沙箱中的任意两个 SWF 彼此之间可以自由交互。后面的关系图说明了 SWF 如何与其它沙箱中的 SWF 以及文件系统和服务器交互。
在图 5 中, 箭头表示 SWF 来源。在下面的一系列关系图中, 箭头则表示访问。虚线箭头表示数据加载, 而轮廓箭头表示跨域脚本处理。图 6 演示了用于默认沙箱中 SWF 的权限。
图 6.默认沙箱分配, 以及默认情况下这些沙箱中的可用权限
默认情况下, 本地 SWF 位于供文件系统使用的本地沙箱中。从此沙箱中, SWF 可以 (例如, 使用 XML.load() )从本地文件系统或 UNC 网络路径上的文件中读取数据, 但不能以任何方式与 Internet 通信。
除了远程 SWF 无法再加载本地内容之外, 远程 SWF 的权限与 Flash Player 7 中的权限没有差异。远程 SWF 始终位于和其来源域相对应的沙箱中。通过 a.com 沙箱, SWF 可以从位于 a.com 的服务器中读取数据 (例如, 使用 XML.load() ), 并且可以将数据发送到 Internet 上的任意位置 (例如, 使用 XML.send() )。
图 7 演示了远程 SWF 的权限, 这些权限在默认情况下不可用, 但可以授予这些权限。
图 7.通过授权提供的用于远程 SWF 的权限
如果 b.com 包含允许从 a.com 或所有域进行访问的策略文件, 则来自 a.com 的 SWF 可以从位于 b.com 的服务器读取 (例如, 使用 XML.load)数据。如果 b.com SWF 调用 System.security.allowDomain("a.com") , 则来自 a.com 的 SWF 可以对来自 b.com 的 SWF 进行跨域脚本处理 (例如, 在 b.com SWF 中调用 ActionScript 方法)。Flash Player 7 中提供了这些权限, Flash Player 8 中并未对它们进行更改。
默认情况下, 远程 SWF 不能对本地 SWF 进行跨域脚本处理。但是, 允许供网络使用的本地 SWF 和受信任的本地 SWF 授予由远程 SWF 使用 System.security.allowDomain() 跨域处理脚本的权限。不允许供文件系统使用的本地 SWF 授予此类权限, 因为这可能导致供文件系统使用的本地 SWF 和远程 SWF 合作读取本地文件系统中的数据, 并将该数据发送给 Web 服务器。
图 8 演示了给予受信任的本地 SWF 不受限制的权限。受信任的本地 SWF 可以从本地文件读取数据, 与任意服务器交互, 还可以对其它任何 SWF 进行脚本处理。
图 8.受信任的本地 SWF 的权限
图 9 演示了供文件系统使用的本地 SWF 的特权, 这些权限默认情况下不可用, 但可以通过授权来授予。受信任的本地 SWF 可以使用 System.security.allowDomain("*") 授予权限, 以便由供文件系统使用的本地 SWF 进行脚本处理。
图 9. 通过授权提供的供文件系统使用的本地 SWF 的权限
请注意, 只能通过向所有域授予权限来向供文件系统使用的本地 SWF 授予权限。所有域要求反映了这样一个事实, 即允许供文件系统使用的本地 SWF 访问等于允许任何人访问, 因为 Flash Player 无法确定本地 SWF 的来源。
不能由远程 SWF 或供网络使用的本地 SWF 向供文件系统使用的本地 SWF 授予权限, 因为这可能导致供文件系统使用的本地 SWF 与远程或供网络使用的本地 SWF 合作读取本地文件系统中的数据, 并将该数据发送至 Web 服务器。
缺少权限时, 只允许供文件系统使用的本地 SWF 从本地文件系统中加载数据 (例如, 使用 XML.load() )。
图 10 演示了将自身声明为供网络使用而非供文件系统使用的本地 SWF 可用的默认权限。缺少权限时, 只允许供网络使用的本地 SWF 与其它供网络使用的本地 SWF 通信, 并将数据发送至服务器 (例如, 使用 XML.send() )。
图 10. 默认情况下供网络使用的本地 SWF 的权限
图 11 演示了供网络使用的本地 SWF 的权限, 这些权限默认情况下不可用, 但可以通过授权来授予。
图 11.通过授权提供的供网络使用的本地 SWF 的权限
如果 a.com 包含允许从所有域进行访问的策略文件, 则允许从 a.com 的服务器中读取供网络使用的本地 SWF。
如果 a.com SWF 调用 System.security.allowDomain("*") , 则允许供网络使用的本地 SWF 对来自 a.com 的 SWF 进行跨域脚本处理 (例如, 在 a.com SWF 中调用 ActionScript 方法)。类似地, 如果受信任的本地 SWF 调用 allowDomain("*") , 则允许供网络使用的本地 SWF 对受信任的本地 SWF 进行跨域脚本处理。
注意, 只能通过向所有域授予权限来向供网络使用的本地 SWF 授予权限。所有域要求反映了这样一个事实, 即允许供网络使用的本地 SWF 访问等于允许任何人访问, 因为 Flash Player 无法确定本地 SWF 的来源。
无法建立允许供网络使用的本地 SWF 从本地文件读取数据的任何权限。
图 12 总结了当具有一组最大权限时可能存在的数据流。
图 12.数据流摘要
使用权限, 供网络使用的本地 SWF 可以与远程 SWF 和服务器完全互操作。还可以使受信任的本地 SWF 与网络资源自由通信, 反之亦然。
但请注意, 即使具备这样的一组最大权限, 数据也必须通过受信任的本地 SWF, 才能从本地文件系统流向 Internet。