Flex安全沙箱

原文地址:http://aaagu1234.blog.163.com/blog/static/400937152010022114749766/

 

 

Flex安全沙箱

 

Flex的最重要兩個文件:MXML文件與AS文件。

MXML與AS的hello world,如何編譯這就不說了(還有Flex與Flash什麼區別等等這些基本點都不用提了):

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>

        <![CDATA[

            import mx.controls.Alert;

            Alert.show("hello world");

        ]]>

    </mx:Script>

</mx:Application>

MXML文件其實就是個XML文件,其內可以使用 <mx:Script> </mx:Script>這樣的標籤來內嵌AS腳本(就像HTML文件中 <script> </script>標籤內寫JS一樣)。除了可以使用import來動態導入Flex與Flash的模塊(可以理解爲就是個as文件)外,還可以使用下面兩種方式導入as文件:

<mx:Script source="hello.as"/>

<mx:Script>

    <![CDATA[

        include "hello.as";

    ]]>

</mx:Script>

說這些的目的是因爲在瀏覽器的客戶端應用上,除了JS還有什麼腳本是值得關注的?那就是AS了,同樣很重要的邏輯控制部分!而界面展示上,此時 MXML與HTML就類似了(看上面,看上面,自己類比下):)。RIA不是已經炒作很火熱了嗎?Flex就是致力於RIA的應用,Adobe爲了擴大戰場,推出了AIR環境,那麼此時採用Flex編寫的程序在瀏覽器中與桌面環境下都可以很好的移植了。像Flex與Flash這樣奇怪的東西,戰場不僅僅在瀏覽器上,還跑到了桌面環境下。一個很重要的安全模型就被提出了:Flash的安全沙箱。要是沒這樣的安全策略,恐怕這個世界就不安寧了,當然初期,這個世界本身就不安寧(我接觸Flash時,那時還是5.0、6.0版本的,那是04年,我剛上大學的時候……)。這樣的策略是這些年逐漸完善的。

其實說Flash的安全沙箱就包含進Flex了,因爲本質都是Flash,都是運行在Flash Player這個容器中的,Flex僅僅是將程序員與設計人員分離了而已。

進入本次的主題- -。。

因爲是筆記,所以不會詳細,而且這些筆記來自我看的書籍與資料(這似乎是廢話)。

安全沙箱包括:遠程沙箱與本地沙箱。其實這個沙箱模型類似與瀏覽器中的同源策略。在同一域內的資源會被放到一個安全組下,這個安全組就被稱爲安全沙箱了。

在深入瞭解沙箱之前先得明確Flash Player的權限控制(我還是按照Flash CS3上的中文官方文檔的名詞來劃分吧):

1、管理用戶控制:

這指系統的最高權限用戶,win下的Administrator,linux下的root等。有兩種類型的控制:

a)、mms.cfg文件:數據加載、隱私控制、Flash Player更新、舊版文件支持、本地文件安全性、全屏模式等。

b)、"全局 Flash Player 信任"目錄:當某些SWF文件被指定到這個受信任的目錄下時,這些SWF 文件會被分配到受信任的本地沙箱。它們可以與任何其它SWF文件進行交互,也可以從任意位置(遠程或本地)加載數據。該信任目錄的默認路徑爲:C:/windows/system32/Macromed/Flash/FlashPlayerTrust。

2、用戶控制:

相對於第1種,這裏的用戶是指普通用戶。有這三種類型的控制:

a)、攝像頭與麥克風設置:還記得ClickJacking的那個Flash DEMO麼?

b)、共享對象存儲設置:就是那個SharedObject了。

c)、相對與"全局 Flash Player 信任"目錄,用戶權限這也有個"用戶 Flash Player 信任"目錄。默認路徑:C:/Documents and Settings/JohnD/Application Data/Macromedia/Flash Player/#Security/FlashPlayerTrust。

3、Web 站點控制(跨域策略文件):

就是家喻戶曉的crossdomain.xml文件了,現在的安全策略是該文件只能存放在站點根目錄下了,文件格式如:

<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from domain="*" />

</cross-domain-policy>

隨便看個例子:http://fanfou.com/crossdomain.xml。通過該文件的配置可以提供允許的域跨域訪問本域上內容的權限。

4、作者(開發人員)控制:

開發者可以通過編碼(在AS腳本中)指定允許的安全控制權限,如:

Security.allowDomain("www.xeye.us");

當然都支持通配符*了。這個通配符真是個瘟神,程序員可得謹慎使用,以免添加不必要的安全風險。

好,Flash Player的權限控制明瞭之後,現在可以來看看安全沙箱了。

1、遠程沙箱:

這個遠程沙箱控制着遠程域上,瀏覽器環境中的安全策略,比如http://xeye.us/域中的Flash文件就無法單刀直入地與http: //hi.baidu.com/ycosxhack域上的Flash文件交互。同一個域(嚴格域)下的所有文件屬於一個沙箱,沙箱內的對象是可以互相返回,而沙箱之間的對象需要交互的話,得靠上面介紹的權限控制的“Web 站點控制(跨域策略文件)”與“作者(開發人員)控制”進行了。

2、本地沙箱:

出來個本地沙箱,沒辦法,Flash與Flex文件可以在我們的桌面環境下運行。如果沒有個很好的安全策略來限制這些功能不弱的AS腳本的話,那絕對是很危險的事。

它有三種類型:

a)、只能與本地文件系統內容交互的本地沙箱:顧名思義,就是該Flash文件在本地運行時是不能與網絡上的對象進行通信的,而只能與本地對象進行交互。

b)、只能與遠程內容交互的本地沙箱:還是顧名思義,此時的Flash文件要與遠程域對象交互時,需在遠程域上通過策略文件或以Security.allowDomain編碼方式來設置訪問策略(同遠程沙箱)。此時不能訪問本地文件。

c)、受信任的本地沙箱:完美了,上面介紹的權限控制中,管理用戶與普通用戶都有Flash Player信任目錄的控制權限,只要將我們的SWF文件放到受信任目錄內運行,那麼這個Flash文件就可以與本地域和遠程域通信了:)。

當然以上這些沙箱類型,我們可以通過編碼來確定當前運行的Flash文件被分配到什麼類型的沙箱中。還是通過Security類:Security.sandboxType,值:

Security.REMOTE(遠程沙箱)

Security.LOCAL_WITH_FILE(只能與本地文件系統內容交互的本地沙箱)

Security.LOCAL_WITH_NETWORK(只能與遠程內容交互的本地沙箱)

Security.LOCAL_TRUSTED(受信任的本地沙箱)

恩,Flash的安全沙箱就是這些筆記了,寫到這,還不得不提下Flash的一些其他安全問題。這些安全問題大多圍繞安全沙箱進行。

在我們發佈Flash時生成的HTML文件內, <object>與 <embed>標籤內的幾個屬性需要明確的。

allowNetworking:

該參數控制Flash文件的網絡訪問功能。有三個值:all(所有的網絡API都可用)、internal(除了不能使用瀏覽器導航和瀏覽器交互的API外,其它的都可用)、none(所以網絡API都不可用)。

allowScriptAccess:

這是AS與JS通信的安全控制,還記得ExternalInterface的作用嗎。有三個值:never(ExternalInterface的 call方法不能與HTML的JS腳本進行通信)、sameDomain(同域內就可以了,這是默認值)、always(這個就允許所有域了,比較危險)。

allowFullScreen:

全屏模式的安全問題,這是一個boolean值,默認爲false,不允許Flash全屏。全屏帶來的安全問題莫非是用戶界面欺騙這樣的類型?我不是很清楚。

上面這三個屬性得區分好了啊。安全問題不僅這點,還有比如LocalConnetion的本地通信、共享對象SharedObject的使用、 E4X在AS中的使用、其它的Socket通信、一些網絡API,比如全局的navigateToURL、Flash與其它非Flash的外部對象的通信問題等等。這些安全問題大都圍繞安全沙箱進行。Flash或者Flex文件可以做得很漂亮,很精彩,比如那些非常優秀的Flash動畫與遊戲,然而一定得時刻保持警惕。

與 標籤內的幾個屬性需要明確的。 allowNetworking: 該參數控制Flash文件的網絡訪問功能。有三個值:all(所有的網絡API都可用)、internal(除了不能使用瀏覽器導航和瀏覽器交互的API外,其它的都可用)、none(所以網絡API都不可用)。 allowScriptAccess: 這是AS與JS通信的安全控制,還記得ExternalInterface的作用嗎。有三個值:never(ExternalInterface的 call方法不能與HTML的JS腳本進行通信)、sameDomain(同域內就可以了,這是默認值)、always(這個就允許所有域了,比較危險)。 allowFullScreen: 全屏模式的安全問題,這是一個boolean值,默認爲false,不允許Flash全屏。全屏帶來的安全問題莫非是用戶界面欺騙這樣的類型?我不是很清楚。 上面這三個屬性得區分好了啊。安全問題不僅這點,還有比如LocalConnetion的本地通信、共享對象SharedObject的使用、 E4X在AS中的使用、其它的Socket通信、一些網絡API,比如全局的navigateToURL、Flash與其它非Flash的外部對象的通信問題等等。這些安全問題大都圍繞安全沙箱進行。Flash或者Flex文件可以做得很漂亮,很精彩,比如那些非常優秀的Flash動畫與遊戲,然而一定得時刻保持警惕。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章