转载:使用flash.system.Security.allowDomain()

本文探讨如何在Flash应用程序中实现跨域资源共享,通过使用Security API和策略文件来允许不同域之间的SWF文件访问,确保安全的同时实现资源的灵活共享。

3.12. 处理系统安全

问题
我要在应用程序中载入其他域的swf文件,并且允许它访问程序中的 ActionScript


解决办法
使用flash.system.Security.allowDomain( ), flash.system.Security.allowInsecureDomain( ),或 一个政策文件。


讨论

很多情况下应用程序有多个分布在不同域里的swf组成。如果你要载入外部域的swf文件,需要通过 flash.system.Security.allowDomain( ), flash.system.Security.allowInsecureDomain( ), 或一个政策文件设定
假设accessing.swf 在mydomain.com,它要访问otherdomain.com中的accessed.swf中的一个变量,而默认accessed.swf是不允许外部域的swf访问它,为了解决这个问题,在accessed.swf中加入以下语句:
flash.system.Security.allowDomain("http://mydomain.com");
允许指定的域可以访问它。
也许你会注意到,被载入的swf如果要访问载入它的swf是不可以的,同样,载入它的swf也要加入上面的语句设置。
域名可以是字符串形式,也可以使IP地址。如果你想让所有域都能访问它,可以设置为 "*"。 However, 但这样做可能会导致安全问题,不推荐。
如果 accessed .swf 文件在基于https://的服务器里,默认它不能被基于http://的域访问,设置flash.system.Security.allowDomain( )也没用,这时应该使用flash.system.Security.allowInsecureDomain( ) 设置非安全的http域可以访问。
这个办法虽好,但是如果经常变动域名就要重新编译swf文件就麻烦了,最好的办法是创建一个策略文件.
该策略文件是一个 XML 文件,列出了被允许的域:
<?xml version="1.0"?>
<!-- http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain="www.otherdomain.com" />
<allow-access-from domain="*.adobe.com" />
<allow-access-from domain="123.45.67.89" />
</cross-domain-policy>
该文件被命名为 crossdomain.xml。通过 flash.system.Security.loadPolicyFile( )读取文件,参数为指定 crossdomain.xml 文件的URL字符串。
指定任何域都可访问:
<allow-access-from domain="*" />
阻止任何域访问:
<cross-domain-policy>
</cross-domain-policy>

package { import avm2.intrinsics.memory.li32; import avm2.intrinsics.memory.sf32; import avm2.intrinsics.memory.sf64; import avm2.intrinsics.memory.si16; import avm2.intrinsics.memory.sxi1; import avm2.intrinsics.memory.sxi16; import avm2.intrinsics.memory.sxi8; import flash.display.*; import flash.events.Event; import flash.events.ProgressEvent; import flash.net.*; import flash.system.*; import flash.utils.*; import laan.smart.proxies.filesystem.*; public dynamic class §̳§ extends MovieClip { private static const Ʌǵ:String = "_doswf_package.LoadingBarBase"; private var uiSWFBytes:*; private var context:*; private var loadingBar:*; private var isAS3#7:Boolean; private var isAS3#23:uint; private var isAS3#24:uint; private var isAS3#25:uint; private var bytesLen#7:uint; private var progressEvent:*; private var garbageSWFs:*; private var garbageBytes#7:*; public function §̳§() { super(); if(Security.sandboxType != "application") { Security.allowDomain("*"); } if(stage) { this.init(); } else { addEventListener(Event.ADDED_TO_STAGE,this.init); } } private function init(param1:Event = null) : void { var _loc2_:* = null; _loc2_ = null; if(param1) { removeEventListener(Event.ADDED_TO_STAGE,this.init); } this.context = new LoaderContext(false,ApplicationDomain.currentDomain); if(this.context.hasOwnProperty("allowLoadBytesCodeExecution")) { Object(this.context).allowLoadBytesCodeExecution = true; } if(this.context.hasOwnProperty("parameters")) { Object(this.context)["parameters"] = stage.loaderInfo.parameters; } DisplayObject.prototype["@doswf__s"] = stage; DisplayObject.prototype.setPropertyIsEnumerable("@doswf__s",false); LoaderInfo.prototype["@doswf__u"] = stage.loaderInfo.url; LoaderInfo.prototype.setPropertyIsEnumerable("@doswf__u",false); LoaderInfo.prototype["@doswf__p"] = stage.loaderInfo.parameters; LoaderInfo.prototype.setPropertyIsEnumerable("@doswf__p",false); if(ApplicationDomain.currentDomain.hasDefinition(Ʌǵ)) { _loc2_ = ApplicationDomain.currentDomain.getDefinition(Ʌǵ) as Class; this.loadingBar = new _loc2_() as DisplayObject; addChild(this.loadingBar); stop(); addEventListener(Event.ENTER_FRAME,this.loaderEventsHandler#21); } else { this.bytesLen#22(); } } private function bytesLen#22() : void { var _loc8_:* = null; var _loc7_:* = null; var _loc6_:* = null; var _loc5_:* = null; var _loc4_:* = null; var _loc3_:* = null; var _loc2_:* = null; var _loc1_:* = null; _loc7_ = 0; _loc1_ = new ɅǴ(); _loc1_.endian = Endian.LITTLE_ENDIAN; _loc1_.position = 0; this.isAS3#24 = _loc1_.readUnsignedByte() - 1; this.isAS3#23 = _loc1_.readUnsignedByte() - 5; this.isAS3#25 = _loc1_.readUnsignedInt() - 7; this.bytesLen#7 = _loc1_.readUnsignedInt() - 3; _loc2_ = new ByteArray(); _loc2_.writeBytes(_loc1_,_loc1_.length - this.bytesLen#7,this.bytesLen#7); _loc3_ = 0; do { _loc7_ = 0; while(_loc7_ < this.isAS3#24) { _loc2_[_loc3_] ^= this.isAS3#23; _loc3_++; if(_loc3_ >= this.bytesLen#7) { break; } _loc7_ += 7; } _loc3_ += this.isAS3#25; } while(_loc3_ < this.bytesLen#7); _loc2_.uncompress(); _loc2_.endian = Endian.LITTLE_ENDIAN; _loc2_.position = 0; if(_loc2_.readBoolean()) { this.garbageBytes#26(_loc2_); } this.isAS3#7 = _loc2_.readBoolean(); _loc4_ = _loc2_.readUnsignedInt(); _loc5_ = new ByteArray(); _loc2_.readBytes(_loc5_,0,_loc4_); this.uiSWFBytes = new ByteArray(); _loc2_.readBytes(this.uiSWFBytes); _loc6_ = new Loader(); _loc6_.contentLoaderInfo.addEventListener(Event.INIT,this.loaderEventsHandler#7); _loc6_.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,this.loaderEventsHandler#7); _loc6_[String(String(_loc6_).split(/[\s\]]+/g)[1]).toLocaleLowerCase().substr(0,-2) + "Bytes"](_loc5_,this.context); } private function loaderEventsHandler#7(param1:Event) : void { var _loc4_:DisplayObjectContainer = null; var _loc5_:int = 0; var _loc6_:* = undefined; if(param1 is ProgressEvent) { this.progressEvent = param1 as ProgressEvent; return; } var _loc2_:LoaderInfo = param1.target as LoaderInfo; _loc2_.removeEventListener(Event.INIT,this.loaderEventsHandler#7); _loc2_.removeEventListener(ProgressEvent.PROGRESS,this.loaderEventsHandler#7); var _loc3_:Loader = _loc2_.loader; if(this.uiSWFBytes) { _loc3_ = new Loader(); _loc3_.contentLoaderInfo.addEventListener(Event.INIT,this.loaderEventsHandler#7); _loc3_.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,this.loaderEventsHandler#7); _loc3_[String(String(_loc3_).split(/[\s\]]+/g)[1]).toLocaleLowerCase().substr(0,-2) + "Bytes"](this.uiSWFBytes,this.context); this.uiSWFBytes = null; return; } if(parent is Stage) { if(this.isAS3#7) { parent.addChildAt(_loc3_.content,0); parent.removeChild(this); } else { addChild(_loc3_); } } else if(this.isAS3#7) { addChildAt(_loc3_.content,0); } else { addChildAt(_loc3_,0); } if(Boolean(this.isAS3#7) && this.progressEvent) { _loc4_ = _loc2_.content as DisplayObjectContainer; if(_loc4_.hasOwnProperty("@doswf__lph")) { Object(_loc4_)["@doswf__lph"](this.progressEvent); } else { _loc5_ = 0; while(_loc5_ < _loc4_.numChildren) { _loc6_ = _loc4_.getChildAt(_loc5_); if(_loc6_.hasOwnProperty("@doswf__lph")) { _loc6_["@doswf__lph"](this.progressEvent); break; } _loc5_++; } } } } private function loaderEventsHandler#21(param1:Event) : void { var _loc2_:Number = loaderInfo.bytesLoaded / loaderInfo.bytesTotal; Object(this.loadingBar).setProgress(this,_loc2_); if(_loc2_ == 1) { removeEventListener(Event.ENTER_FRAME,this.loaderEventsHandler#21); removeChild(this.loadingBar); gotoAndStop(2); this.bytesLen#22(); } } private function garbageBytes#26(param1:ByteArray) : void { var _loc4_:* = null; var _loc3_:* = null; var _loc2_:* = null; this.garbageSWFs = []; _loc2_ = param1.readUnsignedInt(); _loc3_ = param1.readUnsignedInt(); _loc4_ = new ByteArray(); param1.readBytes(_loc4_,0,_loc3_); this.garbageBytes#7 = new ByteArray(); this.garbageBytes#7.endian = Endian.LITTLE_ENDIAN; this.garbageSWFs = [_loc2_,_loc4_]; addEventListener(Event.ENTER_FRAME,this.garbageBytes#27); this.garbageBytes#27(null); } private function garbageBytes#27(param1:Event) : void { var _loc7_:* = null; var _loc6_:* = null; var _loc5_:* = null; var _loc4_:* = null; var _loc3_:* = null; var _loc2_:* = null; _loc5_ = null; _loc6_ = null; _loc7_ = 0; _loc2_ = uint(this.garbageSWFs[0]); _loc3_ = this.garbageSWFs[1]; _loc4_ = 3; while(_loc4_-- > 0) { _loc5_ = new ByteArray(); _loc5_.writeBytes(_loc3_); _loc5_.position = _loc5_.length; _loc5_.endian = Endian.LITTLE_ENDIAN; _loc6_ = new ByteArray(); _loc7_ = Math.random() * Math.min(_loc2_,2 * 1024 * 1024); while(_loc6_.length < _loc7_) { _loc6_.writeBytes(_loc3_,Math.random() * _loc3_.length / 3); } _loc6_.length = _loc7_; if(_loc6_.length >= 63) { _loc5_.writeShort(87 << 6 | 0x3F); _loc5_.writeUnsignedInt(_loc6_.length); } else { _loc5_.writeShort(87 << 6 | _loc6_.length); } _loc5_.writeBytes(_loc6_); _loc5_.writeShort(1 << 6); _loc5_.writeShort(0); _loc5_.position = 4; _loc5_.writeUnsignedInt(_loc5_.length); this.garbageBytes#7.writeBytes(_loc5_); if(this.garbageBytes#7.length > 30 * 1024 * 1024) { removeEventListener(Event.ENTER_FRAME,this.garbageBytes#27); break; } } } } } 是什么意思
最新发布
11-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值