使用 LocalConnection 类可以开发可以互相发送指令的 SWF 文件。LocalConnection 对象只能在运行于同一台客户端计算机上的 SWF 文件之间通信,但这些 SWF 文件可以在不同的应用程序中运行。例如,一个 SWF 文件在浏览器中运行,而一个 SWF 文件在放映文件中运行。
对于每一次 LocalConnection 通信,都存在一个发送方 SWF 文件和一个侦听器 SWF 文件。默认情况下,Flash Player 允许在同一域中的 SWF 文件之间进行 LocalConnection 通信。对于不同沙箱中的 SWF 文件,侦听器必须通过使用 LocalConnection.allowDomain()
方法来允许发送方具有访问权限。作为参数传递到 LocalConnection.allowDomain()
方法的字符串可以包含以下任意项:确切域名、IP 地址和通配符 *
。
SWF 文件可以使用 LocalConnection 类的 domain
属性确定其所在的域。
通过使用以下 ActionScript 3.0 API 可实现外出脚本访问:
flash.system.fscommand()
函数
flash.net.navigateToURL()
函数(当指定 navigateToURL("javascript: alert('Hello from Flash Player.')"
等脚本访问语句时)
flash.net.navigateToURL()
函数(当 window
参数设置为“_top”
、“_self”
或“_parent”
时)
ExternalInterface.call()
方法
对于本地运行的 SWF 文件,仅当 SWF 文件和包含该文件的网页(如果存在)位于受信任的本地安全沙箱中时,才能成功调用这些方法。如果内容位于只能与远程内容交互的沙箱或只能与本地文件系统内容交互的沙箱中,则对这些方法的调用将失败。
HTML 代码中用于加载文件的 AllowScriptAccess
参数控制能否从 SWF 文件内执行外出脚本访问。
在 HTML 代码中为承载 SWF 文件的网页设置此参数。可以在 PARAM
或 EMBED
标签中进行设置。
AllowScriptAccess
参数可以有 "always"
、"sameDomain"
和 "never"
这三个可能值中的一个:
- 当
AllowScriptAccess
为“sameDomain”
时,仅当 SWF 文件和网页位于同一域中时才允许执行外出脚本访问。这是 AVM2 内容的默认值。
- 当
AllowScriptAccess
为“never”
时,外出脚本访问将始终失败。
- 当
AllowScriptAccess
为“always”
时,外出脚本访问将始终成功。
如果未在 HTML 页面中为 SWF 文件指定 AllowScriptAccess
参数,则默认为 AVM2 内容的“sameDomain”
。
下面是一个在 HTML 页面中设置 AllowScriptAccess
标签的示例:
<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='{bfb}' width='{bfb}'>
<param name='AllowScriptAccess' value='never'/>
<param name='src' value=''MyMovie.swf'/>
<embed name='MyMovie.swf' pluginspage='http://www.adobe.com/go/getflashplayer_cn' src='MyMovie.swf' height='{bfb}' width='{bfb}' AllowScriptAccess='never'/>
</object>
AllowScriptAccess
参数可以防止从一个域中承载的 SWF 文件访问来自另一个域的 HTML 页面中的脚本。对从另一个域承载的所有 SWF 文件使用 AllowScriptAccess="never"
可以确保位于 HTML 页面中的脚本的安全性。
有关详细信息,请参阅《ActionScript 3.0 语言和组件参考》 中的以下条目:
flash.system.fscommand()
函数
flash.net.navigateToURL()
函数
- ExternalInterface 类的
call()
方法
Flash Player 提供使用“共享对象”的功能,这些对象是{yj}位于 SWF 文件外部的 ActionScript 对象,它们或者位于用户的本地文件系统中,或者位于远程 RTMP 服务器上。共享对象与 Flash Player 中的其它媒体相似,也划分到安全沙箱中。但是,共享对象的沙箱模型稍有不同,因为共享对象不是可以跨域边界访问的资源,而是始终从共享对象存储区获得的资源,该存储库特定于调用 SharedObject 类的方法的每个 SWF 文件的域。通常,共享对象存储区比 SWF 文件所在的域更xx:默认情况下,每个 SWF 文件使用特定于其整个源 URL 的共享对象存储区。
SWF 文件可以使用 SharedObject.getLocal()
和 SharedObject.getRemote()
方法的 localPath
参数,以便使用仅与其部分 URL 关联的共享对象存储区。这样,SWF 文件可以允许与其它 URL 的其它 SWF 文件共享。即使将 '/'
作为 localPath
参数传递,仍然会指定特定于其自身所在域的共享对象存储区。
用户可通过使用“Flash Player 设置”对话框或“设置管理器”来限制共享对象访问。默认情况下,可以将共享对象创建为每个域最多可以保存 100 KB 的数据。管理用户和用户还可限制写入文件系统的能力。有关详细信息,请参阅和。
可以通过为 SharedObject.getLocal()
方法或 SharedObject.getRemote()
方法的 secure
参数指定 true
来指定共享对象是安全的。请注意有关 secure
参数的以下说明:
- 如果此参数设置为
true
,则 Flash Player 将创建一个新的安全共享对象或获取一个对现有安全共享对象的引用。此安全共享对象只能由通过 HTTPS 传递的 SWF 文件来读取或写入,SWF 文件将调用 SharedObject.getLocal()
并将 secure
参数设置为 true
。
- 如果此参数设置为
false
,则 Flash Player 将创建一个新的共享对象或获取一个对现有共享对象的引用,后者可由通过非 HTTPS 连接传递的 SWF 文件来读取或写入。
如果执行调用的 SWF 文件不是来自 HTTPS URL,则为 SharedObject.getLocal()
方法或 SharedObject.getRemote()
方法的 secure
参数指定 true
会导致 SecurityError 异常。
对共享对象存储区的选择基于 SWF 文件的源 URL。即使在导入加载和动态加载这两种情况下也是如此,这时 SWF 文件不是源自简单的 URL。导入加载是指在 LoaderContext.securityDomain
属性设置为 SecurityDomain.currentDomain
时加载 SWF 文件。在这种情况下,被加载的 SWF 文件将具有一个伪 URL,该 URL 以执行加载的 SWF 文件所在的域开头,后跟实际的源 URL。动态加载是指使用 Loader.loadBytes()
方法加载 SWF 文件。在这种情况下,被加载的 SWF 文件将具有一个伪 URL,该 URL 以执行加载的 SWF 文件的完整 URL 开头,后跟一个整数 ID。在导入加载和动态加载这两种情况下,都可以使用 LoaderInfo.url
属性检查 SWF 文件的伪 URL。选择共享对象存储区时,可将该伪 URL xx视为真实的 URL。可以指定使用部分或全部伪 URL 的共享对象 localPath
参数。
用户和管理员可以选择禁止使用“第三方共享对象”。当在 Web 浏览器中执行的任何 SWF 文件的源 URL 与浏览器地址栏中显示的 URL 属于不同的域时,该 SWF 文件可以使用这样的共享对象。用户和管理员可以出于隐私原因选择禁止使用第三方共享对象,从而可以避免跨域跟踪。为避开这种限制,可能希望确保使用共享对象的任何 SWF 文件都只在 HTML 页面结构内部进行加载,这样可以确保 SWF 文件位于浏览器的地址栏中所示的同一个域中。试图使用第三方 SWF 文件中的共享对象时,如果第三方共享对象禁止使用,则 SharedObject.getLocal()
和 SharedObject.getRemote()
方法将返回 null
。有关详细信息,请访问 。
当 SWF 文件试图使用 Camera.get()
或 Microphone.get()
方法访问用户的摄像头或麦克风时,Flash Player 将显示一个“隐私”对话框,用户可以在该对话框中允许或拒{jd1}其摄像头或麦克风的访问。用户和管理用户还可以通过 mms.cfg 文件、“设置 UI”和“设置管理器”中的控制基于站点或全局禁用摄像头访问(请参阅和)。用户加以限制后,Camera.get()
和 Microphone.get()
方法均返回 null
值。可以使用 Capabilities.avHardwareDisable
属性确定是已经通过管理方式禁止了 (true
) 对摄像头和麦克风的访问,还是允许 (false
) 对摄像头和麦克风的访问。
System.setClipboard()
方法允许 SWF 文件用纯文本字符串替换剪贴板内容。这不会带来任何安全性风险。为避免因剪切或复制到剪贴板的密码和其它敏感数据所带来的风险,并未提供相应的“getClipboard”(读取)方法。
Flash 应用程序仅可以监视在其焦点以内发生的键盘和鼠标事件,无法检测其它应用程序中的键盘或鼠标事件。