.NET 運行時設計目標之一是防止惡意代碼滲透遠端機器。CLR 透過程式碼存取安全性(CAS)與角色型安全性限制不受信任組件的行為。安全例外屬執行期檢查,開發機通常擁有完全信任,故開發期難發現。本文針對建立元件庫或網路部署組件的開發者,提供實務建議。
若代碼無需特殊權限,應避免呼叫 CAS API 斷言權限,否則僅增加效能開銷。大多數 .NET Framework 組件安裝時即受信任,CLR 驗證 IL 確保無危險行為(如直接存取原始記憶體),不需額外權限斷言。
/unsafe 編譯選項的 C# 代碼皆為安全代碼(不含指標操作);從網路下載的代碼受限於檔案系統存取權限。解決方案:System.IO.IsolatedStorage 提供以組件、應用程式域、使用者為範疇的虛擬目錄,受信任組件可讀寫專屬區域,彼此隔離、對其他使用者不可見。
// 寫入
IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForDomain();
using (var stream = new IsolatedStorageFileStream("SavedStuff.txt", FileMode.Create, iso))
using (var writer = new StreamWriter(stream)) { writer.WriteLine("data"); }
// 讀取
using (var stream = new IsolatedStorageFileStream("SavedStuff.txt", FileMode.Open, iso))
using (var reader = new StreamReader(stream)) { var data = reader.ReadToEnd(); }
注意:獨立儲存區有配額限制,防止惡意佔用磁碟;不適用於需管理員手動部署的設定;未加密前不宜存放高機密資料(非託管代碼仍可存取)。
資料庫、網路埠、登錄表、列印子系統等皆需額外權限。策略:
.NET 安全模型要求代碼行為經得起驗證。最小化權限需求、隔離高風險代碼、善用獨立儲存區,是編寫安全、可部署組件的關鍵。