MSDN 首頁 

How To:使用程式碼存取安全性原則來限制組件

發佈日期: 2004 年 5 月 28 日
本頁內容
目標目標
適用於適用於
如何使用本單元如何使用本單元
總結總結
必須知道的事項必須知道的事項
建立執行檔案 I/O 的組件建立執行檔案 I/O 的組件
建立 Web 應用程式建立 Web 應用程式
測試沒有程式碼存取安全性限制的檔案 I/O測試沒有程式碼存取安全性限制的檔案 I/O
設定程式碼存取安全性原則以限制檔案 I/O設定程式碼存取安全性原則以限制檔案 I/O
測試有程式碼存取安全性限制的檔案 I/O測試有程式碼存取安全性限制的檔案 I/O

目標

透過本單元即可:

設定 .NET 組件的程式碼存取安全性原則。

使用程式碼存取安全性限制組件的 I/O 功能。

回到頁首回到頁首

適用於

本單元適用於下列產品及技術:

Microsoft® Windows® 2000 Server 和 Windows 2000 Professional、Windows Server™ 2003、Windows XP Professional 作業系統

Microsoft .NET Framework 1.1 版

回到頁首回到頁首

如何使用本單元

若要充分瞭解本單元:

您必須有使用 Visual C# .NET 和 Visual Studio .NET 的程式設計經驗。

回到頁首回到頁首

總結

系統管理員可以設定程式碼存取安全性原則,限制 .NET Framework 程式碼 (組件) 的操作。本單元說明如何設定程式碼存取安全性原則,來限制組件執行檔案 I/O 及限制對特定目錄之檔案 I/O 的能力。

回到頁首回到頁首

必須知道的事項

您使用 .NET Framework 1.1 設定工具建立新權限集合和新程式碼群組。權限集合定義程式碼可以做和無法做的事,程式群組則將權限集合與特定的程式碼關聯,例如特定的組件或組件集合。

除了限制檔案 I/O 之外,可以使用程式碼存取安全性原則對程式碼加上其他限制。例如,您可以限制程式碼存取由程式碼存取安全性保護的其他類型資源的能力,包括資料庫、目錄服務、事件日誌、登錄、網域名稱系統 (DNS) 伺服器、Unmanaged 程式碼及環境變數。

注意 這份清單不夠詳盡,但是代表 Web 應用程式存取的許多一般資源類型。

開始使用程式碼存取安全性原則來限制組件之前,應該先注意下列各點:

若要限制 Web 應用程式,使其只能存取自己虛擬目錄階層中的檔案,可以在 Web.config 中加入以下內容,設定應用程式只能以「中」度信任等級執行:

<system.web>
<trust level="Medium" />
</system.web>

這會使用 ASP.NET 程式碼存取安全性原則,來限制 Web 應用程式執行檔案 I/O 的能力,並且加上其他限制。例如,中度信任等級的應用程式不能直接存取事件日誌、登錄或 OLE DB 資料來源。

ASP.NET 程式碼存取安全性原則是獨立設定的,與企業層級、電腦層級和使用者層級的程式碼存取安全性原則無關。.NET Framework 1.1 版設定工具只支援企業層級、電腦層級和使用者層級的原則。

您必須使用文字或 XML 編輯器維護 ASP.NET 原則。如需使用中度信任等級執行 Web 應用程式的詳細資訊,請參閱單元 9<配合 ASP.NET 使用程式碼存取安全性>。

建立組件時,可以使用程式碼存取安全性,以程式加上限制。如需執行方式的詳細資訊,請參閱單元 8<程式碼存取安全性實務>。

通常您應避免建立會接受使用者提供之檔案名稱與路徑的 Web 應用程式,因為這會遇到標準化問題而造成安全性風險。有時您必須接受檔案名稱作為輸入。本 How To 會說明可以如何限制組件,確定它無法存取檔案系統的任一部分。如需執行檔案 I/O 的詳細資訊,請參閱《增強 Web 應用程式的安全性》的單元 7<建置安全的組件>裡的「檔案 I/O」和單元 8<使用程式碼存取安全性實務>。

如需程式碼存取安全性基礎的詳細資訊,請參閱《增強 Web 應用程式的安全性》裡的單元 8<程式碼存取安全性實務>。

回到頁首回到頁首

建立執行檔案 I/O 的組件

在這個步驟中,您使用提供的檔案名稱建立執行檔案 I/O 的組件。

若要建立執行檔案 I/O 的新組件

1.

建立名為 FileIO 的新 Microsoft Visual C#™ 開發工具類別庫專案,將 class1.cs 重新命名為 FileIO.cs

2.

為組件加上增強名稱。
加上增強名稱會以數位簽署組件,可以防止組件遭到竄改。增強名稱的公開金鑰元件也提供程式碼存取安全性原則的加密式增強式舉證。系統管理員可以使用增強名稱唯一識別組件,以套用原則。

3.

使用固定的組件版本。開啟 Assemblyinfo.cs 並設定 AssemblyVersion 屬性,如下所示:

[assembly: AssemblyVersion("1.0.0.1")]

4.

將下列 using 陳述式加入 FileIO.cs 的最上面:

using System.IO;
using System.Text;

5.

Class1 重新命名為 FileWrapper,並密封類別以防止繼承。

public sealed class FileWrapper

6.

將預設建構函式重新命名,以符合類別名稱,並將其變更為 private,這會防止建立 FileWrapper 類別的執行個體。這個類別只提供靜態方法。

7.

加入以下公用方法,使其從指定的檔案讀取。

public static string ReadFile(string filename)
{
byte[] fileBytes = null;
long fileSize = -1;
Stream fileStream = null;

try
  {
if(null == filename)
    {
throw new ArgumentException("Missing filename");
    }
// 標準化及驗證提供的檔案名稱
// GetFullPath:
// - 檢查無效的字元 (Path.InvalidPathChars 所定義的)
// - 檢查 Win32 非檔案類型裝置名稱,包括
//   實體磁碟機、並列與序列埠、管道、郵件插槽
//   等等
// - 將檔案路徑正常化

filename = Path.GetFullPath(filename);
fileStream = File.OpenRead(filename);
if(!fileStream.CanRead)
    {
throw new Exception("Unable to read from file.");
    }
fileSize = fileStream.Length;
fileBytes = new byte[fileSize];
fileStream.Read(fileBytes, 0, Convert.ToInt32(fileSize));
return Encoding.ASCII.GetString(fileBytes);
  }
catch (Exception ex)
  {
throw ex;
  }
finally
  {
if (null != fileStream)
fileStream.Close();
  }
}
回到頁首回到頁首

建立 Web 應用程式

在這個步驟中建立呼叫檔案 I/O 組件的 Web 應用程式組件。

若要建立 Web 應用程式

1.

將名為 FileIOWeb 的新 C# ASP.NET Web 應用程式專案加入目前的解決方案。

2.

在新專案中加入參照 FileIO 專案的一個專案參照。

3.

在 WebForm1.aspx 中加入文字方塊,讓使用能夠輸入路徑與檔案名稱。將其 Text 屬性設定為 c:\temp\somefile.txt,並將 ID 設定為 txtFileName

4.

在 WebForm1.aspx 加入一個按鈕,並將其 Text 屬性設定為讀取檔案ID 設定為 btnReadFile

5.

連按兩下 [讀取檔案] 按鈕,將以下程式碼加入事件處理常式:

string s = FileIO.FileWrapper.ReadFile( txtFileName.Text );
Response.Write(s);

6.

建立解決方案。

回到頁首回到頁首

測試沒有程式碼存取安全性限制的檔案 I/O

在預設的狀況下,程式碼存取安全性原則會授與 Web 應用程式和其在本機電腦上呼叫的任何組件完全信任。Machine.config 中的預設 <trust> 設定會將完全信任等級指派給所有的 Web 應用程式,如下所示:

<trust level="Full" originUrl="" />

使用完全信任時,程式碼存取安全性原則不會以任何方式限制 Web 應用程式。資源存取的成功或失敗是由作業系統安全性決定。

若要測試沒有程式碼存取安全性限制的檔案 I/O

1.

使用記事本建立名為 Somefile.txt 的文字檔,然後將檔案放入 C:\temp 目錄中。另外將一份複本放入 C:\ 根目錄中。

2.

執行 Web 應用程式,然後按一下 [讀取檔案]。
就會顯示文字檔的內容。

3.

在文字方塊中輸入 c:\somefile.txt,再按一下 [讀取檔案]。
就會顯示文字檔的內容。

回到頁首回到頁首

設定程式碼存取安全性原則以限制檔案 I/O

在這個步驟中,您設定 FileIO 組件的程式碼存取安全性原則,並授與它有限制的 FileIOPermission,使其只能存取 C:\Temp 之下的檔案。首先建立包含限制 FileIOPermission 的一個新權限集合。然後建立一個新程式碼群組,使用增強名稱舉證將新權限集合與 FileIO 組件關聯。

若要建立新的權限集合

1.

從 [管理工具] 程式集資料夾啟動 .NET Framework 1.1 版設定工具。

2.

展開 [Runtime 安全性原則] 節點。
會顯示三個等級的程式碼存取安全性原則:[企業]、[電腦] 及 [使用者]。您可以設定的程式碼存取安全性原則的第四個等級是應用程式領域等級。ASP.NET 實作應用程式領域等級原則,但是並非使用 .NET Framework 1.1 版設定工具維護。若要編輯 ASP.NET 原則,必須使用文字編輯器。

如需 ASP.NET 原則和如何使用原則的詳細資訊,請參閱單元 9<配合 ASP.NET 使用程式碼存取安全性>。

3.

展開 [電腦] 節點。
就會顯示 [程式碼群組] 和 [權限集合] 資料夾。每個原則檔包含一個程式碼群組的階層集合。程式碼群組用於指派權限給組件。程式碼群組包含兩個元素:

成員資格條件 — 以舉證為基礎,例如組件的增強名稱。

權限集合 — 權限集合包含的權限會授與舉證符合成員資格條件的組件。

權限集合 是一個群組,包含個別程式碼存取安全性權限的集合。個別權限代表程式碼存取特定資源類型或執行特定類型特權操作的權利。

4.

在 [權限集合] 上按一下滑鼠右鍵,然後按一下 [新增]。

5.

在 [名稱] 欄位中輸入「RestictedFileIO」,然後按一下 [下一步]。

6.

從 [可用的權限] 清單中選取 [FileIO],然後按一下 [加入]。

7.

在 [檔案路徑] 欄位中輸入「c:\temp」,再選取 [讀取] 與 [路徑描述]。
FileIO 組件用於標準化及驗證提供之檔案名稱的 Path.GetFullPath 函式需要路徑描述權限。

FileIO 組件使用的 File.OpenRead 方法需要讀取權限。

8.

按一下 [確定]。

9.

從 [可用的權限] 清單中選取 [安全性],然後按一下 [加入]。
FileIO 組件除了 FileIOPermission 以外,也需要這個權限才能執行。要執行的權限是以 SecurityPermission 表示,其 Flags 屬性設定為 SecurityPermissionFlag.Execution

10.

按一下 [啟用組件執行],然後按一下 [確定]。

11.

按一下 [完成],完成權限集合的建立。
現在您已建立好名為 RestrictedFileIO 的新權限集合,其中包含一個限制的 FileIOPermission,允許到 C:\Temp 目錄的讀取和路徑描述,以及一個限制的 SecurityPermission,允許組件執行。

若要建立新的程式碼群組

1.

展開 [程式碼群組],然後展開 [All_Code]。

2.

在 [All_Code] 上按一下滑鼠右鍵,然後按一下 [新增]。

3.

輸入「FileIOAssembly」作為程式碼群組名稱,然後按一下 [下一步]。

4.

從 [選擇這個程式碼群組的條件類型] 下拉式清單中選取 [StrongName]。
您使用這個程式碼群組將 RestrictedFileIO 定義的特定權限套用至 FileIO 組件。增強名稱提供加密的增強名稱來唯一識別組件。

5.

若要指定 FileIO 組件的公開金鑰 (因為組件有增強名稱,所以有這個金鑰),按一下 [匯入],然後瀏覽至包含 FileIO.dll 的專案輸出資料夾。按一下 [開啟],從組件解壓縮公開金鑰。

6.

按一下 [下一步],然後從 [使用現有的權限集合] 下拉式清單中選取 [RestrictedFileIO]。

7.

按一下 [下一步],再按一下 [完成],完成程式碼群組的建立。
現在您已建立好新的程式碼群組,會將 RestrictedFileIO 權限集合定義的權限套用至 FileIO 組件。

8.

在右邊的視窗中選取 [FileIOAssembly] 程式碼群組,然後按一下 [編輯程式碼群組屬性]。

9.

選取 [這個原則層級只會具有這個程式碼群組使用權限集合的使用權限] 和 [這個層級以下的原則層級不會被評估]。
在目前電腦等級或從 ASP.NET 應用程式領域等級為程式碼群組選取這些屬性,會影響授與 FileIO 組件的權限集合。這可以確保只會授與組件由您先前建立之 RestrictedFileIO 組件集合定義的權限。

注意 如果不選取這些選項,預設電腦原則會授與組件完全信任,因為組件是安裝在本機電腦上,適用 My_Computer_Zone 設定。

10.

按一下 [確定] 以關閉 [內容] 對話方塊。

回到頁首回到頁首

測試有程式碼存取安全性限制的檔案 I/O

在這個程序中,您在全域組件快取 (GAC) 中安裝 FileIO 組件。然後執行 Web 應用程式,再嘗試存取 C:\Temp 之內和之外的檔案。您在前一步驟設定的程式碼存取安全性原則會限制程式碼,使其只能存取 C:\Temp 底下的檔案。

組件應安裝在 GAC 中,因為 ASP.NET 會將增強名稱組件當成無領域組件載入。ASP.NET Web 應用程式呼叫的所有增強名稱組件都應安裝在 GAC 中。如需此一問題的詳細資訊,請參閱單元 7<建置安全的組件>中的「增強名稱」。

注意 預設電腦原則與 ASP.NET 原則通常針對安裝在 GAC 中的組件,會授與完全信任的權限。您為前一步驟建立之程式碼群組指派的 [這個原則層級只會具有這個程式碼群組使用權限集合的使用權限] 和 [這個層級以下的原則層級不會被評估] 屬性,會確保不授與組件完全信任的權限,而只授與您先前建立之 RestrictedFileIO 權限集合定義的權限。

測試有程式碼存取安全性限制的檔案 I/O

1.

使用 Gacutil.exe 公用程式將 FileIO 組件安裝到 GAC 中。
建置後可以呼叫 Gacutil.exe,以確保順利在 Microsoft Visual Studio® .NET 中建立好組件之後,它會放在 GAC 裡。

1.

在 Visual Studio .NET 中顯示 FileIO 專案的 [內容] 對話方塊。

2.

在 [公用內容] 中選取 [建置事件]。

3.

在 [建置後事件命令列] 檔案中鍵入 "C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\gacutil" -i $(TargetPath)

4.

按一下 [確定] 關閉專案 [內容] 對話方塊。

2.

重新建立解決方案。

3.

從指令行執行 Iisreset.exe,以強制回收 ASP.NET 處理序。
這會強制重新計算 FileIO 組件的權限授與。如果自您上次執行 Web 應用程式之後,ASP.NET 應用程式領域仍在作用中,可能是組件仍然由 ASP.NET 快取著。

4.

執行 Web 應用程式,然後按一下 [讀取檔案]。
文字檔案的內容應會順利顯示。您建立的原則允許 FileIO 組件從 C:\Temp 和底下的目錄讀取檔案。

5.

在文字方塊中輸入 C:\somefile.txt,然後按一下 [讀取檔案]。
應該會產生 SecurityException,因為您設定的程式碼存取安全性原則不允許 C:\Temp 目錄之外的檔案 I/O。

例外狀況的詳細資訊會顯示 FileIOPermission 已失敗,如下所示:

System.Security.SecurityException: Request for the permission of type 
System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.5000.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089 failed.

回到頁首回到頁首