LoaderContext详解

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/LoaderContext.html

这里swf指被载入的swf,loader是加载方。

securityDomain

只对swf有效,图片无效。

如果载入同一个域(服务器)下的swf,那么总是和loader同一securityDomain,这个不叫import。

如果使用loader.loadbytes(),则必然和loader同一个securityDomain,这个叫import。


如果使用load载入不同域的swf:

默认为另一个securityDomain,没有import。

可以选择设置为和loader同一个securityDomain(不能设其他的securityDomain),这个是import,这个行为称为import loading,等同于把那个不同域的swf拷贝到当前服务器域内载入。被加载的swf所在服务器必须有policy file信任loader所在域。


看官方文档的过程发现一个漏洞 ,其他人已经写文阐述了绕开AS3安全沙箱,跨域加载SWF  。

沙盒中的程序访问stage的属性、鼠标事件、像素绘制、其他一些属性受限。这是父SWF限制子SWF访问。

而cross-domain policy files则是子SWF所在域防止父SWF对其加载,有点搞不懂了,到底出于安全需要谁需要限制谁?

从跨域脚本攻击来说,应该是子SWF限制父SWF访问子的接口。

allowCodeImport

是否允许import swf:

1.使用Loader.loadBytes()载入swf。

2.使用Loader.load() 从其他域载入swf时,设置 LoaderContext.securityDomain = SecurityDomain.currentDomain。

对于图片没影响,对于当前域的swf也没影响。

applicationDomain

构造函数 ApplicationDomain(parentDomain:ApplicationDomain = null)

这里父swf指loader所在swf,子swf指被加载的swf。

关于 ApplicationDomain:system domain包含所有application domains,包括current domain。current domain是main app运行的环境。

每个security domain分成多个applicationDomain。所以只能对载入为与loader同一个security domain中swf,设置此属性,不然会抛SecurityError 。而且也只能赋予同一个security domain的applicationDomain作为其父域。


设置这个属性不是为了安全因素,因为总能通过ApplicationDomain.getDefinition()访问到类;而是为了管理代码,主要是两个swf中有同名(同包同类啥都同)类。


1.默认情况下loader的applicationDomain是子swf的applicationDomain的父。

context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain)

允许子swf直接使用父swf定义的class。父swf只能通过ApplicationDomain.getDefinition()获取子swf定义的class。

重复定义的class:子swf直接使用父swf定义的class,父swf本来就只能访问自己的。两者都通过子swf的applicationDomain.getDefinition()获取子swf定义的class。

2.子swf使用和父swf相同的applicationDomain。

context.applicationDomain = ApplicationDomain.currentDomain

父子双方可以直接使用对方定义的class。

重复定义的class:使用父swf定义的,子swf定义的被忽略。怎么获取子swf定义的不知道是否可以通过getDefinition获得。

3.system domain作为子SWF的父域。

context.applicationDomain = new ApplicationDomain()

双方只能通过对方的getDefinition获得对方代码中类的定义。

不会发生冲突。

4.其他域作为子swf的父域

比如context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain)

只要使同一个security domain下的就行。


父swf获取子swf的applicationDomain :Loader.contentLoaderInfo.applicationDomain。

这里所谓直接使用class指ApplicationDomain.currentDomain.getDefinition()获得,不能直接使用指必须用对方的applicationDomain.getDefinition()获得。

checkPolicyFile

下载其他域的图片(非swf)时需要检查URL policy file。对swf无用,swf是通过Security.allowDomain()。

因为涉及其他域,只对load有效,对loadbytes无效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值