繞開AS3安全沙箱,跨域加載SWF

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的安全模型

您可以加載來自任何可訪問源的內容。 
如果執行調用的 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 文件無法訪問其數據。 
在只能與本地文件系統的內容交互的沙箱中的影片剪輯不能對只能與遠程內容交互的沙箱中的影片剪輯使用腳本,反之亦然。

發佈了115 篇原創文章 · 獲贊 5 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章