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

VB.NET 與 C# 開發者必懂的 .NET 安全性議題(上):程式碼存取安全性與部分信任環境開發實戰

     編輯:關於C語言

前言:.NET 安全模型的範式轉移

早期 Visual Studio 版本幾乎不涉及程式碼層面的安全控制,一切仰賴作業系統權限。.NET Framework 引入 程式碼存取安全性,根據程式碼來源(區域)、強名稱、發布者憑證、URL 等證據,授予精細權限集合。這意味著:相同使用者、相同程式碼,放在本機硬碟與網路共享執行,權限可能截然不同。開發者必須預期權限不足導致的例外,並在程式碼中妥善處理。

五大區域與信任等級

區域來源預設信任
我的電腦本機硬碟完全信任
區域內部網路Intranet 共享資料夾中度信任
網際網路網路下載低度信任
信任的網站IE 信任站點區域中度信任
不信任的網站IE 受限站點區域不信任

系統管理員可透過「管理工具」調整各區域權限。你無法控制用戶端的安全設定,只能在程式碼中優雅地應對權限拒絕。

完全信任 vs 部分信任

  • 完全信任:本機開發、測試環境,無安全例外,最容易產生「在我機器上能跑」的錯覺。
  • 部分信任:Intranet 共享執行、網路下載執行(ClickOnce、XBAP)。常被拒絕的權限:檔案 I/O、登錄存取、環境變數、事件日誌、目錄服務、效能計數器、訊息佇列等。

部分信任環境開發三大核心技巧

1. Try/Catch 捕獲 SecurityException

// C#
public void SaveBitmap()
{
    Bitmap b = null;
    try
    {
        b = new Bitmap(100, 100);
        b.Save(@"c:\PrettyPicture.bmp");
    }
    catch (System.Security.SecurityException)
    {
        MessageBox.Show("權限不足,無法儲存圖片。");
    }
    catch (Exception ex)
    {
        MessageBox.Show("其他錯誤:" + ex.Message);
    }
}

關鍵點:先捕獲 SecurityException,再捕獲通用 Exception,區分「安全性拒絕」與「一般 I/O 錯誤」,給使用者明確回饋。

2. 宣告式權限需求

在組件層級宣告最低權限需求,載入時即由 CLR 驗證,不足則拒絕載入並拋出例外:

[assembly: FileIOPermission(SecurityAction.RequestMinimum, Write = @"c:\PrettyPicture.bmp")]

適用於類別庫,主程式需包裝 try/catch 處理載入失敗。

3. 命令式權限需求

在程式碼中動態檢查權限:

string path = @"c:\PrettyPicture.bmp";
FileIOPermission perm = new FileIOPermission(FileIOPermissionAccess.Write, path);
try
{
    perm.Demand(); // 若無權限拋出 SecurityException
    bmp.Save(path);
}
catch (SecurityException) { /* 處理 */ }

優點:可在執行前預檢,決定是否執行替代邏輯(如存至隔離存儲、記憶體串流)。

隔離存儲:部分信任的安全避風港

當檔案系統權限不足時,System.IO.IsolatedStorage 提供每組件/使用者/網域獨立的虛擬檔案系統,**無需額外權限即可讀寫**。

using (var store = IsolatedStorageFile.GetUserStoreForAssembly())
using (var stream = new IsolatedStorageFileStream("data.dat", FileMode.Create, store))
using (var writer = new BinaryWriter(stream))
{
    writer.Write(bmpBytes);
}

測試策略:強制觸發安全例外

  1. 將編譯輸出複製至網路共享資料夾,直接執行 → 觸發 Intranet 區域權限
  2. 使用 caspol.exe 建立自訂程式碼群組,指定低權限集合
  3. IE 設定「網際網路」區域安全等級為「高」,下載執行
  4. 單元測試模擬 SecurityException 驗證捕獲邏輯

其他關鍵資源

總結

「權限不足」不是 Bug,而是 .NET 安全模型的正常行為。優秀的 .NET 開發者會:預期權限缺失、捕獲 SecurityException、提供降級方案(隔離存儲/記憶體/使用者提示)、在多區域測試驗證。下一篇將深入 Web 應用程式安全性、ASPNET 進程身分、動態發現、身分驗證與模擬機制。

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