掌握安全模型
安全模型從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:
security.local_with_network:
允許本地檔案訪問網路。訪問網路要遵守跨域機制。不能以任何方式訪問本地內容。
security.local_trusted:
既可以訪問本地內容又可以訪問網路。前提是被加入信任位置。調式模式和生成的exe也是這個級別。因為除錯和執行exe都是使用者主動的行為,被看作使用者認可的。
除此之外:
遠端沙箱中的檔案始終不能訪問本地。
位於相同沙箱中的資源才能互相訪問。
繞過沙箱:
若想繞過flash安全機制進行資料交換。只有尋求第三方――伺服器指令碼。通過伺服器指令碼互相交換資料。但這樣也要遵守指令碼之間的安全機制,而且不能進行檔案交流。
securitydomain類
securitydomain類基於object,使用import flash.system.securitydomain宣告。securitydomain類是單例模式。只能使用靜態屬性表示當前安全沙箱。當swf跨域通訊時,可以把跨域沙箱中的swf載入到本地安全沙箱中。
屬性:securitydomain.currentdomain:securitydomain:
當前安全域。
跨域訪問機制:
在伺服器上,同乙個域中的檔案,資料或者swf可以任意訪問。若要跨域訪問需被授權。注意不同網域名稱即使對映到相同ip位址也會被看成兩個域。ip位址名和通過解析的位址也被看作兩個域。有兩種授權方式:策略檔案和作者授權。
策略檔案:
策略檔案宣告某個域中的檔案可以被指定域訪問。策略適用於所有形式的訪問。是個xml檔案,格式如:
策略檔案中可以使用萬用字元。使用*萬用字元表示能被所有**訪問。secure用於https協議與http互相訪問。false表示允許互相訪問。
預設策略檔案:
預設策略檔案放在**根目錄下面名字必須為crossdomain.xml。
載入策略檔案:
若覺得預設策略檔案給伺服器維護造成影響。可放到子域中,用system.security.loadpolicyfile(url)來載入。
策略檔案型別:
策略檔案分為頁面策略檔案和套接字策略檔案。套接字策略檔案需要指定埠,如:
由於flashplayer只檢測套接字策略檔案相同埠上的策略檔案,而策略檔案一般放入伺服器中採用http訪問,這時只能使用預設策略檔案並且使用security.loadpolicyfile來載入,如:
security.loadpolicyfile("")
作者授權:
有時候只想開放某個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.exactsetting: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=url:string):void]url:string):void[/url]
載入策略檔案。當不使用預設策略檔案時需要載入。
security.showsettings():void
顯示安全設定面板。
應用程式域:
允許跨域載入swf後,還可能出現載入的swf中的類與主類相同而產生衝突。為此安全模型把載入的swf類用應用程式域劃分。安全域為樹形結構。載入的應用程式域可以是文件類應用程式域的子域。文件類的父級安全域為系統安全域。系統安全域包含所有flashplayer類。為了為我們提供靈活的訪問性,as3允許指定載入swf的位置是任何應用程式域。加入子集應用程式域的檔案能夠直接訪問父級應用程式域。但父級必須使用getdefinition方法訪問子集應用程式域。加入到文件類應用程式域的檔案父級和子集可以直接訪問但可能會產生同名衝突。載入到系統應用程式域則被自動劃分,必須都使用getdefinition方法互相訪問。
屬性:當前應用程式域。
父級應用程式域。
方法:getdefinition(name:string):object
從通過名稱從應用程式域中獲取類,命名空間或函式。
hasdefinition(name:string):object
指定名稱的定義在應用程式域中是否存在。
設定許可權
必要時,我們想使用security.local_trusted沙箱進行本地資料和遠端進行通訊。可以更改本機flashplayer配置檔案或新增信任位置達到目的。比如使用安裝程式在信任位置新增檔案。但是操作必須被授權。as3的許可權層次如圖:
管理員和使用者設定本地許可權:
管理員設定:
使用者設定:
這裡選擇始終允許可以禁止彈出那個煩人的警告框。
**設定即建立跨域檔案。作者設定即使用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發出的事件是不被認可的。
掌握了上述安全機制後,再看到非配到幫助檔案各個角落中的安全問題強調不必去理會了。它們都沒有超出這些知識點。煩惱一掃而光,就此打住,謝謝大家!!
api的安全問題
在給第三方系統提供api時,我們需要注意下安全問題。比較常見的介面有http介面。以http介面為例。我們需要注意的幾點 1.只有被允許的系統才可以呼叫api 2.如果http請求被截獲。也不能隨便修改介面中的引數。在運維方面,可以新增訪問白名單。白名單中有一系列的ip位址。只有白名單中的ip才可以...
單例模式介紹及其執行緒安全問題
介紹下單例模式,即保證對乙個類只例項化乙個物件。實際生產例子有,spring的bean預設建立模式等。一.餓漢式單例 執行緒安全 缺點 直接例項化,資源會浪費。丟失了延遲例項化的效能好處。二.懶漢式單例 執行緒不安全 缺點 執行緒不安全,如果多個執行緒能夠同時進入if instance null 並...
多執行緒的安全問題
首先先提出幾個問題 1.多執行緒程式設計何時會出現執行緒不安全的問題?2.如何解決執行緒不安全的問題?執行緒不安全的本質是多執行緒共享資料,那麼什麼情況下多執行緒會共享資料?無外乎這麼幾種情況 1 多執行緒訪問單例項中的例項變數 2 多執行緒訪問靜態變數 下面將舉例說明,這個例子模擬鐵路售票系統,實...