闪存安全性:将Flash 8 AS2模块加载到Flash 6 AS1模块时出现问题

时间:2009-01-06 03:05:35

标签: flash security loading

我有一个用ActionScript 1编写的旧程序,在Flash 6中编译。它加载了10个其他模块,其中3个是用ActionScript 2编写的,在Flash 8中编译。原始程序嵌入到html中并且在html文件在网络服务器上运行。但是,如果我只是将html文件拖到浏览器中,则不会加载3个AS2模块。或者,更确切地说,它们会加载,但我无法访问它们的功能。 所有模块都使用“本地回放安全性=仅访问本地文件”进行编译。 我使用Flash CS3编译所有模块。 如果不将主加载模块重写为AS2,有什么办法可以解决这个问题吗? 感谢

2 个答案:

答案 0 :(得分:1)

Flash的安全模型的规则有点神秘,但似乎你反对跨脚本限制。一种选择可能是解决它,例如安装Apache(或其他)并通过http://localhost...而不是file://...访问内容。但是,安全问题也可能得到解决。

首先,您可能需要查看this article,特别是该页面中间的图表,其中列出了允许一个SWF访问另一个SWF的基本规则。如图表所示,使所有访问工作的最简单方法是使所有内容在“本地受信任”沙箱中运行。如何做到这一点将在同一篇文章的page 4中部分介绍。

答案 1 :(得分:1)

我不确定这是否与您的问题有关,但混合AVM1 SWF文件可能会有问题。

如果为版本6编译了闪存SWF而没有在输出设置中选择“优化版本6r65”选项,则生成的字节码与为v6r65或更高版本编译的AVM1 swf文件(特别是使用AS2语言时)大部分不兼容而不是AS1)。

这是因为在编译这些早期版本时,对_global属性的任何引用都引用了不同的位置,因此_global命名空间中定义的属性对于以后版本的目标电影不可见,反之亦然。

鉴于类定义作为变量存在于_global命名空间中,当混合目标位于6r65侧的版本的swf文件时,这可能会成为问题。

我记得通过将其中一个SWF文件中的_global引用复制到另一个SWF文件可见的位置来解决这个问题。

(在6r65之前)

class SomeClass
{
    //
}
...
_global.someProp=123;

_level0.globalCopy=_global

(在6r65之后)

trace(SomeClass) //undefined
trace(_global.someProp) //undefined
trace(_level0.globalCopy.SomeClass) //[object object] i.e. defined
trace(_level0.globalCopy.someProp) //123