控制外出 URL 访问



通过使用以下 ActionScript 3.0 API 可实现外出脚本访问和外出 URL 访问(通过使用 HTTP URL、mailto: 等):

  • flash.system.fscommand() 函数

  • ExternalInterface.call() 方法

  • flash.net.navigateToURL() 函数

对于本地运行的 SWF 文件,仅当 SWF 文件和包含该文件的网页(如果存在)位于受信任的本地安全沙箱中时,才能成功调用这些方法。如果内容位于只能与远程内容交互的沙箱或只能与本地文件系统内容交互的沙箱中,则对这些方法的调用将失败。

对于不在本地运行的 SWF 文件,所有这些 API 都可与嵌入这些 API 的网页通信,具体取决于下述 AllowScriptAccess 参数的值。flash.net.navigateToURL() 函数还有额外的功能,可以与任何打开的浏览器窗口或框架通信,而不只是与嵌入 SWF 文件的网页通信。有关此功能的详细信息,请参阅使用 navigateToURL() 函数

HTML 代码中用于加载 SWF 文件的 AllowScriptAccess 参数控制能否从 SWF 文件内执行外出 URL 访问。此参数在 PARAM 或 EMBED 标记内设置。如果不设置 AllowScriptAccess 的值,则仅当 SWF 文件与 HTML 页来自同一个域时才能通信。

AllowScriptAccess 参数可以有 "always""sameDomain""never" 这三个可能值中的一个。
  • AllowScriptAccess"always" 时,SWF 文件可以与其嵌入到的 HTML 页进行通信,即使该 SWF 文件来自不同于 HTML 页的域也可以。

  • AllowScriptAccess"sameDomain" 时,仅当 SWF 文件与其嵌入到的 HTML 页来自相同的域时,该 SWF 文件才能与该 HTML 页进行通信。此值是 AllowScriptAccess 的默认值。使用此设置,或者不设置 AllowScriptAccess 的值,可以防止一个域中的 SWF 文件访问另一个域的 HTML 页内的脚本。

  • AllowScriptAccess"never" 时,SWF 文件将无法与任何 HTML 页进行通信。在 Adobe Flash CS4 Professional 中,不建议使用该值。如果没有在自己的域中提供不受信任的 SWF 文件,则不建议也不应使用该值。如果确实需要使用不受信任的 SWF 文件,则 Adobe 建议您创建一个不同的子域,并将所有不受信任的内容置于其中。

下面的示例说明如何在 HTML 页中设置 AllowScriptAccess 标签以允许对其它域进行外出 URL 访问:

<object id='MyMovie.swf' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' height='100%' width='100%'> 
<param name='AllowScriptAccess' value='always'/> 
<param name='src' value=''MyMovie.swf'/> 
<embed name='MyMovie.swf' pluginspage='http://www.adobe.com/go/getflashplayer' src='MyMovie.swf' height='100%' width='100%' AllowScriptAccess='never'/> 
</object> 

使用 navigateToURL() 函数

除上述 allowScriptAccess 参数所指定的安全设置外,navigateToURL() 函数还有一个可选的第二参数:targettarget 参数可用于指定将 URL 请求发送到的 HTML 窗口或框架的名称。此类请求还有其它一些安全限制,具体的限制取决于是否将 navigateToURL() 用作脚本访问或非脚本访问语句。

对于脚本访问语句,如 navigateToURL("javascript: alert('Hello from Flash Player.')"),适用以下规则。

  • 如果 SWF 文件是本地受信任的文件,则请求成功。

  • 如果目标是 SWF 文件嵌入到的 HTML 页,则适用上述 allowScriptAccess 规则。

  • 如果目标容纳的内容是加载自 SWF 文件所在的域,则请求成功。

  • 如果目标容纳的内容是加载自与 SWF 文件不同的域,并且上述两种条件均不满足,则请求失败。

对于非脚本访问语句(如 HTTP、HTTPS 和 mailto:),如果满足以下所有条件,则请求失败:

  • 目标具有下面任一特殊关键字:"_top" "_parent"

  • SWF 文件位于其它域的网页中。

  • 嵌入 SWF 文件时 allowScriptAccess 的值不是 "always"

详细信息

有关外出 URL 访问的详细信息,请参阅《ActionScript 3.0 语言和组件参考》中的以下条目:

  • flash.system.fscommand() 函数

  • ExternalInterface 类的 call() 方法

  • flash.net.navigateToURL() 函数