這裡面有個概念,什麼是信任環境?什麼又是部分信任環境?
答案是:運行本機電腦上代碼的環境就是信任環境(如機器碼的運行環境本機電腦,.NET的IL代碼的運行環境CLR),運行(從本機電腦外部載入的)代碼的環境就是部分信任環境(如javascript指令碼的運行環境是瀏覽器,Silverlight應用程式的運行環境是Silverlight版CLR),部分信任環境中的代碼一般都是從網路上載入來的。
沙箱這個名字挺形象的,我們可以把它想象成一個盒子,來與本地運行環境進行隔離,以使沙箱中的代碼不能訪問本機資源和代碼。瀏覽器與Silverlight運行環境、電子郵件等都是沙箱。
對於Silverlight應用程式,其啟動並執行沙箱是Silverlight CLR,不過其允許訪問的最大範圍是其所在的html頁面,可以操作html頁面上得dom和js代碼。還可以訪問Silverlight隔離儲存區 (Isolated Storage)中的資源。但除了這些,決不能訪問客戶電腦上的其他資源了,否則就無異於病毒了。
說明:可以對在瀏覽器外啟動並執行 Silverlight 4 及之後的應用程式進行配置,使其運行在受信任的環境中,從而避開許多沙箱功能限制。建立這些類型的應用程式時應加以小心。
代碼類型
Silverlight 中有兩個代碼類型:平台代碼和應用程式代碼。"平台代碼"是由 Silverlight 運行時和 SDK 提供的 API。"應用程式代碼"是您使用平台代碼編寫的代碼。
安全層級
Silverlight 代碼具有三個安全層級,從低到高分別是:“透明”、“安全關鍵”和“關鍵”。所有應用程式代碼都是透明代碼。
"關鍵代碼"是能夠執行安全沙箱外部的操作(如寫入檔案系統)的代碼。"安全關鍵代碼"是位於關鍵代碼頂部的一個代碼層,可協助確保調用是安全的。平台代碼可以是透明的、安全關鍵的或關鍵的。下圖顯示了三個安全層級。
從圖中我們可以看到,透明代碼可以調用安全關鍵代碼,安全關鍵代碼可以調用關鍵代碼,但透明代碼不能直接調用關鍵代碼,否則會MethodAccessException異常。
Silverlight 應用程式中的透明代碼具有下列限制:
-
不能包含無法驗證的代碼。這意味著所有代碼都必須是可驗證為型別安全的。
-
不能通過 P/Invoke 或 COM Interop調用機器碼。
-
不能訪問關鍵代碼或資料,除非目標是標記為安全關鍵的。
安全關鍵代碼可協助確保透明代碼安全地執行關鍵操作。安全關鍵 API 在將控制項傳遞到關鍵 API 之前,通常會執行各種檢查,包括驗證傳入的參數和確保應用程式狀態支援繼續進行調用。在允許安全關鍵調用繼續執行後,它將代表調用方調用一個關鍵方法,或者直接執行操作。
例如,向檔案系統寫入內容的操作實現為關鍵代碼。為了能夠訪問檔案系統中的永久儲存區,Silverlight 提供了一項安全關鍵功能,稱為“隔離儲存區 (Isolated Storage)”。當 Silverlight 應用程式調用隔離儲存區 (Isolated Storage) API 時,該 API 通過確保應用程式正在請求有效檔案並且未超過其儲存配額來驗證請求。然後,隔離儲存區 (Isolated Storage) API 呼叫關鍵 API,以執行讀寫硬碟的實際工作。
使用者啟動
安全關鍵代碼還可以通過另一種方式 - 要求使用者啟動 - 來確保調用的安全性。這意味著要使用 Silverlight 的某些功能,您必須請求使用者輸入內容。例如,使用者必須單擊某個按鈕來顯示 OpenFileDialog。如果試圖在沒有使用者輸入的情況下顯示 OpenFileDialog,將出現 SecurityException。通過請求使用者輸入以啟用許多功能,Silverlight 可向使用者明確他們啟動並執行哪些應用程式正要求提升的特權。下面是需要使用者啟動的功能列表:
|
應用程式功能
|
詳細資料
|
|
檔案系統訪問
|
檔案系統訪問受到限制,並且大多數對話方塊必須是使用者啟動的。有關更多資訊,請參見對話方塊概述。
|
|
全螢幕模式
|
全螢幕模式必須是使用者啟動的並且顯示與如何退出該模式有關的訊息。在使用者按 ESC 鍵或者切換到其他視窗時,應用程式將自動結束全螢幕模式。有關更多資訊,請參見全屏支援。
|
|
網路攝像機和麥克風支援
|
網路攝像機或麥克風的使用必須是使用者啟動的。使用者必須在安全提示中授予許可權。
Silverlight 4 和更高版本。
|
|
列印
|
“列印”對話方塊必須是使用者啟動的。有關更多資訊,請參見列印。
Silverlight 4 和更高版本。
|
|
剪貼簿訪問
|
剪貼簿訪問必須是使用者啟動的。使用者必須在安全提示中授予許可權。在關閉當前頁或者使用者離開當前頁時許可權結束。有關更多資訊,請參見 Clipboard。
Silverlight 4 和更高版本。
|
安全屬性
若要指定安全層級,應向平台代碼添加屬性。所有應用程式代碼都必須是透明的,並且不應使用安全屬性標記。如果應用程式代碼用某一安全屬性標記,則在嘗試不安全的調用時將忽略該屬性並且將發生異常。