`
陈新杰
  • 浏览: 107276 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

AS3安全沙箱,跨域加载SWF

阅读更多
AS3的安全沙箱的确是让人很无奈,本篇文章仅用于解决一个特定的问题,即A服务器上的SWF文件通过http访问B服务器上的SWF文件,此时即使B服务器上设置了crossdomain.xml,也无济于事,B服务器上被加载的SWF文件除必须的crossdomain.xml外,还必须使用Security.allowDomain("*")才能消除安全沙箱(注:我加载的是AS3编写的SWF)。对于无法使用Security.allowDomain("*")的SWF文件,如AVM1的SWF或我们无法编辑被加载的SWF时,我们就可以使用下面这种方式。

使用Loader加载外部SWF文件的时候,如果不出现错误,文件是可以成功加载进来的,只不过是在使用该SWF文件时,flash会报安全沙箱错误,我们可以使用一种方式绕过该安全沙箱,具体操作如下:

1、首先使用一个Loader加载一个外部SWF,监听Loader.contentLoaderInfo的Event.COMPLETE事件;

2、加载成功后,先暂时不使用这个加载成功的Loader,而是另写一个Loader,使用Loader.loadBytes()来加载第一个Loader的contentLoaderInfo.bytes;

3、在第二个Loader加载成功后,就可以使用被加载的SWF文件了;

示例代码:

public function load():void 

    // 第一个Loader用于使用url加载文件 
    var loader1:Loader = new Loader(); 
    loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, loader1Complete); 
    loader1.load(new URLRequest("文件url")); 

 
private function loader1Complete(event:Event):void 

    var loaderinfo:LoaderInfo = event.target as LoaderInfo; 
    // 第二个Loader用于加载第一个Loader加载进来的bytes 
    var loader2:Loader = new Loader(); 
    loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, loader2Complete); 
    loader2.loadBytes(loaderinfo.bytes); 

 
private function loader2Complete(event:Event):void 

    // 在这里可以使用被加载进来的文件了 
    // event.target as DisplayObject 


注意:使用上面的方式,也应该注意B服务器上有crossdomain.xml文件



附:Flash Player的安全模型

您可以加载来自任何可访问源的内容。
如果执行调用的 SWF 文件位于网络沙箱中并且要加载的文件是本地的,则不允许加载。
如果加载的内容为用 ActionScript 3.0 编写的 SWF 文件,那么除非可以通过调用加载的内容文件中的 System.allowDomain() 或 System.allowInsecureDomain() 方法来允许跨脚本排列,否则另一个安全沙箱中的 SWF 文件不能对它执行跨脚本操作。
如果被加载的内容为 AVM1 SWF 文件(用 ActionScript 1.0 或 2.0 编写),则 AVM2 SWF 文件(用 ActionScript 3.0 编写)不能对它执行跨脚本操作。但是,可以通过使用 LocalConnection 类在两个 SWF 文件之间实现通信。
如果被加载的内容为图像,则除非该 SWF 文件的域包含在该图像原始域的跨域策略文件中,否则安全沙箱之外的 SWF 文件无法访问其数据。
在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本,反之亦然。
分享到:
评论

相关推荐

    Flash课件制作教程-加载SWF文件

    5. **安全和沙箱模型**:加载SWF文件时,需要注意Flash的安全模型,包括同一域限制和跨域策略文件。确保被加载的SWF与主文件在同一域或有正确的跨域策略文件,以避免安全错误。 6. **资源管理**:加载的SWF文件作为...

    加载外部swf

    以下是一个基本的加载SWF文件的步骤: 1. **创建Loader对象**:首先,你需要创建一个`Loader`对象,它是负责加载内容的容器。 ```as3 var loader:Loader = new Loader(); ``` 2. **添加事件监听器**:在加载过程中...

    源于FLEX中的安全沙箱问题

    沙箱的安全控制涉及管理员、用户、网络设置和作者设置等利益相关方,他们分别控制权限,包括文件请求、本地数据存储、跨域策略和特定域内容的使用。 【标签】:“安全” 【内容详解】: 1. **安全沙箱机制**: ...

    flash swf之间传值

    1. **使用URLVariables和URLRequest**: 当加载SWF时,你可以通过URLVariables附加参数,B.SWF可以通过URLLoader的`data`属性访问这些参数。在A.SWF中: ```as3 var variables:URLVariables = new URLVariables(); ...

    Flex控制swf简单源码

    加载SWF文件的核心在于使用`Loader`类,它是AS3中的一个核心组件,负责加载各种类型的媒体资源,包括SWF文件。 以下是一段基本的Flex代码示例,展示了如何加载和控制外部SWF文件: ```actionscript import flash....

    FLASH AS3 loading 源文件 源代码

    在Flash AS3编程中,加载(Loading)是关键功能之一,允许开发者动态地在应用程序运行时引入外部资源,如图像、SWF文件、XML或文本数据。本资源包含了一个名为"loading_as3"的示例项目,其中包括了loading_as3.fla...

    Flash AS3.0 Loading an External Image

    AS3.0中的安全沙箱机制限制了跨域加载内容。如果你的图片资源不在同一域下,你需要确保服务器返回了正确的跨域策略文件(crossdomain.xml)。 6. **优化加载性能**: 为了提高用户体验,可以考虑使用预加载器来...

    Flash Loading源程序

    通过实例化Loader对象,我们可以加载SWF、图片(JPEG、PNG、GIF)、XML、文本文件等。 3. **加载流程**:加载过程通常包括创建Loader对象、设置加载目标(如URL或本地文件路径)、添加事件监听器来处理加载进度和...

    flex自定义加载器

    在创建自定义加载器时,要确保遵守这些规则,例如使用`Security.loadPolicyFile()`来允许跨域加载。 4. **数据解码与转换** 如果加载的是非二进制数据,如XML或JSON,加载完成后可能需要解析和转换数据。你可以...

    br.zip_easy

    Loader需要处理跨域安全策略,通过设置crossDomainPolicy文件或使用allowDomain()方法来允许跨域加载。 7. **错误处理**:加载过程中可能出现各种错误,如网络中断、文件损坏等。开发者需要捕获并处理这些错误,...

    flex安全机制详解

    Flex的安全机制之一就是沙箱机制,它限制了SWF文件能够访问的资源范围,以防止恶意代码的执行。沙箱机制将不同的SWF文件隔离在各自的“沙箱”内,这样即使其中一个SWF文件被攻击者利用,也不会影响到其他SWF文件。 ...

    深入理解ApplicationDomain和SecurityDomain

    下面是一个示例代码片段,展示了如何加载一个位于不同安全域的SWF文件,并尝试访问其文档类的实例: ```actionscript var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, ...

    xcode与flash通过socket进行通信

    由于安全原因,Flash Player对通过HTTP/HTTPS加载的SWF文件施加了严格的沙箱限制,防止跨域访问。对于Socket通信,Flash需要进行以下两步: 1. **政策文件请求**:Flash客户端会首先向服务器发送一个政策文件请求,...

    Flex面试题及答案

    3. **外部加载资源**:对于图片、音频等大型资源,通过网络请求动态加载,而不是打包进SWF中。 #### 6. trace(NaN==NaN)的结果解析 `NaN`(Not a Number)是一个特殊数值,任何涉及`NaN`的比较操作都会返回`false`...

Global site tag (gtag.js) - Google Analytics