搜尋部落格文章

2012年12月24日 星期一

[轉]Flash AS3.0學習筆記安全沙箱安全策略文件詳解Security類Application類使用詳解


使用 Flash Cs4中的安全沙箱詳解
掌握安全模型
安全模型從as2開始一直都是學習上的攔路虎,as3安全模型比起as2更加複雜。 凡是包括加載與通信的行為,如swf文件之間的通信,swf與網頁之間的通信,XMLSocket或webService等都受到安全機制的限制。 在幫助文件中隨時會提醒你注意安全模型,並且稱作焦點問題,最大的問題是當發布運行程序時時不時跳出一個安全對話框,讓初學者不知所措。 安全性問題確實很煩人,adobe也不願意搞的複雜,但是沒辦法,因為——人心太壞了,總是有些人要幹壞事,不得不建立法律來限制這些人。 經過整理,我盡量按照能夠接受的方式按順序講解,能讓看完教程的人不再為安全問題迷惑和煩惱的是寫這教程的目標。
本地和遠程:
1.本地和遠程文件:
本機上的swf文件和在本地網頁中嵌入的本地swf是本地文件,服務器上的swf或者服務器頁面嵌入的swf文件是遠程文件。
2.本地和遠程訪問:
使用file協議或路徑名訪問是本地訪問,通過http協議或其它協議訪問是網絡訪問。
關於中文路徑:最好保證路徑為英文名稱。 flash把路徑名統一使用網絡編碼,由於操作系統編碼環境的區別可能導致中文路徑有出現問題。 即使在同一個​​文件夾下,也可能因為文件夾名稱為中文載不進來。 因為as3可能會把相對路徑轉化為絕對路徑。
安全沙箱:
as3中共有4種沙箱類型:
Security.REMOTE:
遠程文件被放入這個沙箱中。 Security.REMOTE不能訪問訪問本地數據。 遠程之間遵守跨域安全策略。 頁面或容器有能力與flash控件通信。
Security.LOCAL_WITH_FILE:
可以訪問本地數據但不能以任何形式訪問網絡,包括:不能用url鏈接,不能載入遠程數據。 flash控件不能跟頁面或容器通信。 本地數據不能以任何方式發送到網絡。
Security.LOCAL_WITH_NETWORK:
允許本地文件訪問網絡。 訪問網絡要遵守跨域機制。 不能以任何方式訪問本地內容。
Security.LOCAL_TRUSTED:
既可以訪問本地內容又可以訪問網絡。 前提是被加入信任位置。 調式模式和生成的exe也是這個級別。 因為調試和運行exe都是用戶主動的行為,被看作用戶認可的。
除此之外:
遠程沙箱中的文件始終不能訪問本地。
位於相同沙箱中的資源才能互相訪問。
繞過沙箱:
若想繞過flash安全機制進行數據交換。 只有尋求第三方――服務器腳本。 通過服務器腳本互相交換數據。 但這樣也要遵守腳本之間的安全機制,而且不能進行文件交流。
SecurityDomain類
SecurityDomain類基於Object,使用import flash.system.SecurityDomain聲明。 SecurityDomain類是單例模式。 只能使用靜態屬性表示當前安全沙箱。 當swf跨域通信時,可以把跨域沙箱中的swf載入到本地安全沙箱中。
屬性:
SecurityDomain.currentDomain:Secu​​rityDomain:
當前安全域
跨域訪問機制:
在服務器上,同一個域中的文件、數據或者swf可以任意訪問。 若要跨域訪問需被授權。 注意不同域名即使映射到相同IP地址也會被看成兩個域。 IP地址名和通過解析的地址也被看作兩個域。 有兩種授權方式:策略文件和作者授權。
策略文件:
策略文件聲明某個域中的文件可以被指定域訪問。 策略適用於所有形式的訪問。 是個xml文件,格式如:




策略文件中可以使用通配符。 使用*通配符表示能被所有網站訪問。 secure用於https協議與http互相訪問。 false表示允許互相訪問。
默認策略文件:
默認策略文件放在網站根目錄下面名字必須為crossdomain.xml。
加載策略文件:
若覺得默認策略文件給服務器維護造成影響。 可放到子域中,用System.security.loadPolicyFile(url)來加載。
策略文件類型:
策略文件分為頁面策略文件和套接字策略文件。 套接字策略文件需要指定端口,如:







由於flashPlayer只檢測套接字策略文件相同端口上的策略文件,而策略文件一般放入服務器中採用http訪問,這時只能使用默認策略文件並且使用Security.loadPolicyFile來加載,如:
Security.loadPolicyFile("http://socketServerHost.com/crossdomain.xml")
作者授權:
有時候只想開放某個swf文件而不是整個域中的數據,作者可以使用Security.allowDomain( )在swf中授權。 作者授權但並不代表互相通信。 除非互相授權。
Security類
Security類基於Object,使用import flash.system.Security聲明,Security類是個靜態類,用於處理安全訪問。
屬性:
Security.sandboxType:String
安全沙箱類型。 使用它的靜態常量表示。 對應上述的4中沙箱類型:
Security.REMOTE,
Security.LOCAL_WITH_FILE,
Security.LOCAL_WITH_NETWORK,
Security.LOCAL_TRUSTED
Security.exactSettings:Boolean
是否精確匹配域,默認為true。 精確匹配指不忽略域名中的機器名,如www.flash.com與john.flash.com被看作不同的域。
方法:
Security.allowDomain(…domains):void
在swf中允許指定域訪問。 多個參數表示多個域,如Security.allowDomain("www.adobe.com","www.macromedia.com","www.flash.com");
Security.allowInsecureDomain(…domains):void
允許https協議的域訪問。
Security.loadPolicyFile(url:String):void
加載策略文件。 當不使用默認策略文件時需要加載。
Security.showSettings(panel:String = "default"):void
顯示安全設置面板。
應用程序域:
允許跨域加載swf後,還可能出現加載的swf中的類與主類相同而產生衝突。 為此安全模型把加載的swf類用應用程序域劃分。 安全域為樹形結構。 加載的應用程序域可以是文檔類應用程序域的子域。 文檔類的父級安全域為系統安全域。 系統安全域包含所有flashPlayer類。 為了為我們提供靈活的訪問性,as3允許指定載入swf的位置是任何應用程序域。 加入子集應用程序域的文件能夠直接訪問父級應用程序域。 但父級必須使用getDefinition方法訪問子集應用程序域。 加入到文檔類應用程序域的文件父級和子集可以直接訪問但可能會產生同名衝突。 加載到系統應用程序域則被自動劃分,必須都使用getDefinition方法互相訪問。
ApplicationDomain類
ApplicationDomain基於Object類,使用import flash.system.Application聲明。 表示應用程序域。
屬性:
currentDomain:ApplicationDomain
當前應用程序域。
parentDomain:ApplicationDomain
父級應用程序域。
方法:
getDefinition(name:String):Object
從通過名稱從應用程序域中獲取類,命名空間或函數。
hasDefinition(name:String):Object
指定名稱的定義在應用程序域中是否存在。
設置權限必要時,我們想使用Security.LOCAL_TRUSTED沙箱進行本地數據和遠程進行通信。 可以更改本機flashPlayer配置文件或添加信任位置達到目的。 比如使用安裝程序在信任位置添加文件。 但是操作必須被授權。 as3的權限層次如圖:


管理員和用戶設置本地權限:
管理員設置:
系統管理員可以修改mms.cfg配置文件和設置全局flash player信任目錄。 mms.cfg為flashPlayer啟動時的安全信息配置文件,可以限制數據加載,隱私控制,播放器更新,本地文件安全性,全屏模式,舊版文件支持6大功能。 但最好不要動這個文件,因為影響太大了。 全局信任目錄中的地址能夠使所有用戶使用Security.LOCAL_TRUSTED沙箱。 全局信任目錄以及mms.cfg路徑在C:\windows\system32\Macromed\Flash\FlashPlayerTrust下。
用戶設置:
用戶也有自己的配置文件和信任目錄。 在
C:\Documents and Settings\xin\Application Data\Macromedia\
Flash Player\#Security\FlashPlayerTrust下。 用戶也可以直接使用設置管理器來代替修改配置文件。 設置管理器在adobe提供的網頁上設置,地址為www.adobe.com/go/settingsmanager_cn 。 裡面說明很詳細,配置起來也很簡單。 如圖:
這裡選擇始終允許可以禁止彈出那個煩人的警告框。
網站設置和作者設置為網絡權限:
網站設置即創建跨域文件。 作者設置即使用Security.allowDomain()方法。
限製網絡API
通過設置flash控件的alowNetworking可以限制as腳本與網絡的通信。 值如下:
"all"─允許使用所有as中的網絡API 默認值。
"internal"─不能調用瀏覽器導航或瀏覽器交互API。
"none"─ 禁止使用任何網絡通信,包括調用API,swf之間通信,超鏈接和使用共享庫。
允許腳本訪問:
允許as中的網絡API後,還要設置flash控件的allowScriptAccess,才能調用容器API或網頁腳本。 allowScriptAccess值如下:
“sameDomain”:swf與網頁必須位於同一域。 才能訪問腳本。 默認值。
“always”:不限制腳本訪問。
“never”:禁止腳本訪問。
全屏安全限制:
要使用全屏模式必須把flash控件的allowFullScreen屬性設置為true。 為防止惡意用戶打開網頁自動全屏,只有flash控件接受了鼠標事件或鍵盤事件後猜允許全屏。 通過dispachEvent發出的事件是不被認可的。