绕开AS3安全沙箱,跨域加载SWF
来源:互联网 发布:阿曼西奥 奥特加 知乎 编辑:程序博客网 时间:2024/06/06 01:20
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的安全模型 转载请注明来自:http://www.shengshiyouxi.com
您可以加载来自任何可访问源的内容。
如果执行调用的 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 文件无法访问其数据。
在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本,反之亦然。
使用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的安全模型 转载请注明来自:http://www.shengshiyouxi.com
您可以加载来自任何可访问源的内容。
如果执行调用的 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 文件无法访问其数据。
在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本,反之亦然。
- 绕开AS3安全沙箱,跨域加载SWF
- 绕开AS3安全沙箱,跨域加载SWF
- 绕开AS3安全沙箱,跨域加载SWF
- 绕开AS3安全沙箱,跨域加载SWF
- 绕开AS3安全沙箱,跨域加载SWF
- [AS3]如何绕开AS3安全沙箱进行跨域加载SWF文件
- 绕开AS3安全沙箱,跨域加载SWF(转)
- AIR加载外部swf,安全沙箱
- flex加载swf文件进行跨域操作时出现异常 安全沙箱冲突
- AS3:加载swf
- AS3如何加载自身SWF
- AS3加载swf与ApplicationDomain
- AS3 加载外部SWF资源
- as3.0 mc加载.swf
- AS3预加载SWF实例
- AS3加载swf与ApplicationDomain
- AS3加载swf与ApplicationDomain
- Flash as3加载外部swf和exe
- 每个程序员都应该了解的内存知识(二)
- 黑马程序员_七、多线程及String类和单例设计模式
- HotSpot 虚拟机对象的创建过和对象的内存结构
- windows下cvs服务器安装配置
- 使用SQL语句获得服务器名称和IP 地址
- 绕开AS3安全沙箱,跨域加载SWF
- 九之再续:教你一步一步用c语言实现sift算法、上
- Image I/O编程指南
- java中获取实体类中的get、set方法名
- 代码规范总结
- 解决/usr/include/sys/types.h:153: error: duplicate ‘unsigned’
- java 读写csv
- Java代码质量检测评估工具-PMD
- FlexPaper阅读器开发手册