首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Effective C# 原則 47:選擇安全代碼,避開 CAS 與檔案系統陷阱

     編輯:關於C#

.NET 運行時設計目標之一是防止惡意代碼滲透遠端機器。CLR 透過程式碼存取安全性(CAS)與角色型安全性限制不受信任組件的行為。安全例外屬執行期檢查,開發機通常擁有完全信任,故開發期難發現。本文針對建立元件庫或網路部署組件的開發者,提供實務建議。

核心原則:能不用 CAS 就不用

若代碼無需特殊權限,應避免呼叫 CAS API 斷言權限,否則僅增加效能開銷。大多數 .NET Framework 組件安裝時即受信任,CLR 驗證 IL 確保無危險行為(如直接存取原始記憶體),不需額外權限斷言。

非託管記憶體:盡量避免

  • 未開啟 /unsafe 編譯選項的 C# 代碼皆為安全代碼(不含指標操作);
  • 指標操作雖快(陣列操作可快 10 倍),但會汙染整個組件安全性;
  • 建議將 unsafe 算法隔離至獨立組件(參見原則 32),限制影響範圍;
  • P/Invoke 或 COM 互操作若需指標,同樣應隔離處理。

檔案系統:改用獨立儲存區

從網路下載的代碼受限於檔案系統存取權限。解決方案: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 安全模型要求代碼行為經得起驗證。最小化權限需求、隔離高風險代碼、善用獨立儲存區,是編寫安全、可部署組件的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved