Flash的安全沙箱——安全域和程序域
什么叫相同域名:协议相同(http和https不同),host相同(www.a.com和new.a.com不同),端口相同(http://www.a.com:80和http://www.a.com:8816不同)
安全域:用来解决不同域名下的文件访问和服务访问安全。
常用到沙箱的几个地方:
(一)文件访问安全:
- js和flash接口调用:通过flash里面设置Security.allowDomain('*');
- flash加载swf调用接口:
1)子swf信任父swf:通过子swf里面设置Security.allowDomain('*');
2)父swf信任子swf:可以在LoaderContext 中设置子的安全域和自己的安全域相同。
- 两个swf通过localconnection通信:Security.allowDomain('*');
(二)服务访问安全:
- flash和php后台的通信:通过服务器配置跨域访问文件解决。
- flash和socket后台的通信:通过843端口放置跨域服务解决。
应用程序域:主要为了解决相同安全域下类的命名冲突问题。应用程序域只存在于相同的安全域下,划分管理类定义。对于加载上来的swf,在加载时候可以通过LoaderContext 指定子应用的程序域。
有四种 ApplicationDomain 属性可供您选择使用:
- 加载器的 ApplicationDomain 的子级。默认值。可以使用语法 new ApplicationDomain(ApplicationDomain.currentDomain) 显式表示这种选择。这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编写 new MyClassDefinedInParent() 来使用。但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain.getDefinition() 来检索它们。这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain.getDefinition() 方法来检索子级的冲突定义,否则将不使用此定义。
- 加载器自己的 ApplicationDomain。使用 ApplicationDomain.currentDomain 时请使用此应用程序域。加载完成后,父级和子级可以直接使用对方的类。如果子级试图定义的类与父级已定义的类同名,则使用父类并忽略子类。
- 系统 ApplicationDomain 的子级。使用 new ApplicationDomain(null) 时请使用此应用程序域。这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。一方查看另一方的类的唯一方式是调用 ApplicationDomain.getDefinition() 方法。
- 其他 ApplicationDomain 的子级。有时可能会有更复杂的 ApplicationDomain 层次结构。可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中。例如,new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain) 将 SWF 文件加载到当前域父级的父级的新子级中。
人和人不要比。自己做自己。