控制外出 URL 访问

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

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

  • flash.system.fscommand() 函数

  • ExternalInterface.call() 方法

  • flash.net.navigateToURL() 函数

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

对于非本地加载的内容,所有这些 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 访问的详细信息,请参阅用于 Adobe Flash Platform 的 ActionScript 3.0 参考中的下列条目: