限制网络 API

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

可通过两种方式限制网络 API。为防止恶意行为,需阻止对常用保留端口进行访问;您不能在自己的代码中覆盖这些阻止设置。要控制 SWF 文件访问与其他端口相关的网络功能,可以使用 allowNetworking 设置。

阻止的端口

Flash Player 和 Adobe AIR 对某些端口的 HTTP 访问设有限制,与浏览器类似。通常用于非 HTTP 类型服务器的某些标准端口上不允许使用 HTTP 请求。

任何访问网络 URL 的 API 都会受到这些端口阻止限制的约束。只有直接调用套接字的 API 例外,如 Socket.connect()XMLSocket.connect(),或 Security.loadPolicyFile() 调用(这种情况是加载套接字策略文件)。对套接字连接的允许或拒绝是通过在目标服务器上使用套接字策略文件实现的。

下面的列表显示了适用端口阻止的 ActionScript 3.0 API:

FileReference.download()FileReference.upload()Loader.load()Loader.loadBytes()navigateToURL()NetConnection.call()NetConnection.connect()NetStream.play()Security.loadPolicyFile()sendToURL()Sound.load()URLLoader.load()URLStream.load()

端口阻止也适用于共享库的导入、文本字段中 <img> 标签的使用、HTML 页中 SWF 文件的加载(使用 <object><embed> 标签)。

端口阻止也适用于文本字段中 <img> 标签的使用、HTML 页中 SWF 文件的加载(使用 <object><embed> 标签)。

下面的列表显示了受阻止的端口:

HTTP:20(ftp 数据)、21(ftp 控制)

HTTP 和 FTP:1 (tcpmux)、7 (echo)、9 (discard)、11 (systat)、13 (daytime)、15 (netstat)、17 (qotd)、19 (chargen)、22 (ssh)、23 (telnet)、25 (smtp)、37 (time)、42 (name)、43 (nicname)、53 (domain)、77 (priv-rjs)、79 (finger)、87 (ttylink)、95 (supdup)、101 (hostriame)、102 (iso-tsap)、103 (gppitnp)、104 (acr-nema)、109 (pop2)、110 (pop3)、111 (sunrpc)、113 (auth)、115 (sftp)、117 (uucp-path)、119 (nntp)、123 (ntp)、135 (loc-srv / epmap)、139 (netbios)、143 (imap2)、179 (bgp)、389 (ldap)、465 (smtp+ssl)、512 (print / exec)、513 (login)、514 (shell)、515 (printer)、526 (tempo)、530 (courier)、531 (chat)、532 (netnews)、540 (uucp)、556 (remotefs)、563 (nntp+ssl)、587 (smtp)、601 (syslog)、636 (ldap+ssl)、993 (ldap+ssl)、995 (pop3+ssl)、2049 (nfs)、4045 (lockd)、6000 (x11)

使用 allowNetworking 参数

您可以通过在包含 SWF 内容的 HTML 页中的 <object><embed> 标签中设置 allowNetworking 参数来控制 SWF 文件访问网络的功能。

allowNetworking 的可能的值为:

  • "all"(默认值)— 在 SWF 中允许所有的网络 API。

  • "internal"— SWF 文件可能不调用浏览器导航或浏览器交互 API(在本节后面部分中列出),但是它会调用任何其他网络 API。

  • "none"— SWF 文件可能不调用浏览器导航或浏览器交互 API(在本节后面部分中列出),并且它无法使用任何 SWF 到 SWF 通信 API(也在本节后面部分中列出)。

allowNetworking 参数主要在 SWF 文件及所在的 HTML 页来自不同的域时使用。当要加载的 SWF 文件与其所在的 HTML 页来自同一个域时,不建议使用 "internal""none" 值,原因是您不能保证始终同时加载 SWF 文件和想要的 HTML 页。不受信任方可以从您的域中加载未包含在 HTML 中的 SWF 文件,这种情况下,allowNetworking 限制不会按预期发挥作用。

调用被禁止的 API 会引发 SecurityError 异常。

在包含 SWF 文件引用的 HTML 页的 <object><embed> 标签中添加 allowNetworking 参数并设置该参数的值,如下面的示例中所示:

<object classic="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
    Code base="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124,0"  
    width="600" height="400" ID="test" align="middle"> 
<param name="allowNetworking" value="none" /> 
<param name="movie" value="test.swf" /> 
<param name="bgcolor" value="#333333" />  
<embed src="test.swf" allowNetworking="none" bgcolor="#333333"  
    width="600" height="400" 
    name="test" align="middle" type="application/x-shockwave-flash"  
    pluginspage="http://www.macromedia.com/go/getflashplayer" /> 
</object>

HTML 页也可以使用脚本生成 SWF 嵌入标签。您需要更改脚本以使其插入正确的 allowNetworking 设置。 Adobe Flash Professional 和 Adobe Flash Builder 生成的 HTML 页面使用 AC_FL_RunContent() 函数嵌入对 SWF 文件的引用。向此脚本添加 allowNetworking 参数设置,如下所示:

AC_FL_RunContent( ... "allowNetworking", "none", ...)

allowNetworking 设置为 "internal" 时,下列 API 被阻止:

navigateToURL()fscommand()ExternalInterface.call()

allowNetworking 设置为 "none" 时,除了上面所列的 API 外,还会禁止下列 API:

sendToURL()FileReference.download()FileReference.upload()Loader.load()LocalConnection.connect()LocalConnection.send()NetConnection.connect()NetStream.play()Security.loadPolicyFile()SharedObject.getLocal()SharedObject.getRemote()Socket.connect()Sound.load()URLLoader.load()URLStream.load()XMLSocket.connect()

即使所选的 allowNetworking 设置允许 SWF 文件使用网络 API,可能仍有其他基于安全沙箱限制的限制(请参阅安全沙箱)。

allowNetworking 设置为 "none" 时,无法在 TextField 对象 htmlText 属性的 <img> 标签中引用外部媒体(这会引发 SecurityError 异常)。

allowNetworking 设置为 "none" 时,在 Flash Professional(而不是 ActionScript)中添加的导入的共享库中的元件在运行时被阻止。