加载数据

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

Flash Player 和 AIR 内容可以与服务器交换数据。加载数据是一种与加载媒体不同的操作,因为加载的信息以程序对象的形式显示,而不是以媒体的形式显示。通常,内容可能从内容源自的同一个域加载数据。但是,内容通常需要策略文件以便从其他域加载数据(请参阅网站控制(策略文件))。

注: AIR 应用程序沙箱中运行的内容无法由远程域提供(除非开发人员特意将远程内容导入应用程序沙箱),因此该内容无法参与策略文件防范的攻击类型。应用程序沙箱中的 AIR 内容加载数据时不受策略文件限制。但是,其他沙箱中的 AIR 内容受此处说明的限制的约束。

使用 URLLoader 和 URLStream

可以加载诸如 XML 文件或文本文件等数据。URLLoader 和 URLStream 类的 load() 方法受到 URL 策略文件权限的控制。

如果您使用 load() 方法从域加载内容而不是调用此方法的代码的内容,则运行时会检查加载资源的服务器上是否存在 URL 策略文件。如果存在策略文件,并且该策略文件授予对加载内容的域的访问权限,则可以加载数据。

连接到套接字

默认情况下,运行时查找端口 843 提供的套接字策略文件。和 URL 策略文件一样,此文件称为“主策略文件”。

在 Flash Player 6 中首次引入策略文件时,并不支持套接字策略文件。与套接字服务器的连接由默认位置中的一个策略文件授权,该默认位置是套接字服务器所在主机的 HTTP 服务器的端口 80。Flash Player 9 仍支持此功能,但 Flash Player 10 不再支持。在 Flash Player 10 中,只有套接字策略文件可授权套接字连接。

与 URL 策略文件类似,套接字策略文件支持元策略语句(用于指定可提供策略文件的端口)。但是,套接字策略文件的默认元策略不是“master-only”而是“all”。即,除非主策略文件指定更具限制性的设置,否则 Flash Player 假定主机上的任意套接字均可提供套接字策略文件。

默认情况下禁止访问套接字和 XML 套接字连接,即使所要连接的套接字与 SWF 文件位于同一个域中也是如此。可以从下列任意位置提供套接字策略文件,从而允许套接字级别访问:

  • 端口 843(主策略文件的位置)

  • 与主套接字连接相同的端口

  • 主套接字连接端口之外的端口

默认情况下,Flash Player 在端口 843 和主套接字连接所在的端口上查找套接字策略文件。如果要从其他端口提供套接字策略文件,SWF 文件必须调用 Security.loadPolicyFile()

套接字策略文件具有与 URL 策略文件相同的语法,只是前者还必须指定要对哪些端口授予访问权限。如果套接字策略文件来自低于 1024 的端口号,则它可以对任何端口授予访问权限;如果策略文件来自 1024 或更高的端口,则它只能对 1024 端口和更高的端口授予访问权限。允许的端口在 <allow-access-from> 标签中的 to-ports 属性中指定。单个端口号、端口范围和通配符都是允许值。

下面是套接字策略文件的示例:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<!-- Policy file for xmlsocket://socks.mysite.com --> 
<cross-domain-policy>  
    <allow-access-from domain="*" to-ports="507" />  
    <allow-access-from domain="*.example.com" to-ports="507,516" />  
    <allow-access-from domain="*.example.org" to-ports="516-523" />  
    <allow-access-from domain="adobe.com" to-ports="507,516-523" />  
    <allow-access-from domain="192.0.34.166" to-ports="*" />  
</cross-domain-policy> 

要从端口 843 或主套接字连接所在的端口上检索套接字策略文件,请调用 Socket.connect()XMLSocket.connect() 方法。Flash Player 首先在端口 843 上检查是否有主策略文件。如果找到主策略文件,Flash Player 将检查该文件是否含有在目标端口上禁止套接字策略文件的元策略语句。如果未禁止访问,Flash Player 首先在主策略文件中查找适当的 allow-access-from 语句。如果找不到主策略文件,Flash Player 将从主套接字连接所在的端口上查找套接字策略文件。

要从其他位置检索套接字策略文件,请首先调用 Security.loadPolicyFile() 方法,调用时使用特殊的"xmlsocket"语法,如下所示:

Security.loadPolicyFile("xmlsocket://server.com:2525"); 

先调用 Security.loadPolicyFile() 方法,然后再调用 Socket.connect()XMLSocket.connect() 方法。Flash Player 随后将一直等待完成策略文件请求,之后再决定是否允许主连接。但是,如果主策略文件指定目标位置不能提供策略文件,则调用 loadPolicyFile() 无效,即使该位置有策略文件。

如果要实现套接字服务器,并且需要提供套接字策略文件,则应决定是使用接受主连接的同一端口提供策略文件,还是使用不同的端口来提供策略文件。无论是哪种情况,服务器都必须等到客户端的第一次传输收到之后才能发送响应。

当 Flash Player 请求策略文件时,它始终会在建立连接后传输以下字符串:

<policy-file-request/>

服务器收到此字符串后,即会传输该策略文件。来自 Flash Player 的请求始终由 null 字节终止,来自服务器的响应也必须由 null 字节终止。

程序对于策略文件请求和主连接并不会使用同一连接,因此请在传输策略文件后关闭连接。如果不关闭连接,Flash Player 将关闭策略文件连接,之后重新连接以建立主连接。

保护数据

要在数据遍历 Internet 时保护其免于被窃听和更改,您可以在作为数据来源的服务器上使用传输层安全性 (TLS) 或套接字层安全性 (SSL)。然后,可以使用 HTTPS 协议连接到该服务器。

在为 AIR 2 或更高版本创建的应用程序中,还可以保护 TCP 套接字通信。通过 SecureSocket 类,您可以启动到使用 TLS 版本 1 或 SSL 版本 4 的套接字服务器的套接字连接。

发送数据

当代码向服务器或资源发送数据时,会执行数据发送操作。对于来自网络域的内容,始终允许发送数据。仅当本地 SWF 文件位于受信任的本地沙箱、只能与远程内容交互的沙箱或 AIR 应用程序沙箱时,它才可以向网络地址发送数据。有关详细信息,请参阅本地沙箱

可以使用 flash.net.sendToURL() 函数向 URL 发送数据。还可以使用其他方法向 URL 发送请求。这些方法包括 Loader.load()Sound.load() 等加载方法以及 URLLoader.load()URLStream.load() 等数据加载方法。

上载和下载文件

FileReference.upload() 方法可以将用户选择的文件上载到远程服务器。必须先调用 FileReference.browse()FileReferenceList.browse() 方法,然后再调用 FileReference.upload() 方法。

仅在响应鼠标事件或键盘事件时才可以调用用于启动 FileReference.browse()FileReferenceList.browse() 方法的代码。如果在其他情况下调用,Flash Player 10 和更高版本会引发异常。但是,从 AIR 应用程序沙箱调用这些方法不需要用户启动的事件。

调用 FileReference.download() 方法可打开一个对话框,用户可以在该对话框中从远程服务器下载文件。

注: 如果服务器要求用户身份验证,则只有在浏览器中运行的 SWF 文件(即使用浏览器插件或 ActiveX 控件的文件)才可以提供对话框来提示用户输入用户名和密码以进行身份验证,并且只适用于下载。Flash Player 不允许上载到需要用户身份验证的服务器。

如果执行调用的 SWF 文件位于只能与本地文件系统内容交互的沙箱中,则不允许执行上载和下载操作。

默认情况下,SWF 文件不会在自身所在服务器之外的服务器上执行上载或下载操作。如果其他服务器提供策略文件向执行调用的 SWF 文件所在的域授予访问权限,则执行调用的 SWF 文件可以在其他服务器上执行上载或下载操作。