溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CLR 4.0安全模型的運作機制是什么

發(fā)布時間:2021-07-15 10:53:52 來源:億速云 閱讀:107 作者:chen 欄目:編程語言

本篇內容介紹了“CLR 4.0安全模型的運作機制是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

CLR 4.0安全模型三層安全級別及其運作機制

CLR4.0中的安全級別,從低到高排列如下:

Transparent

SafeCritical

Critical

其運作機制如下圖所示,可以用三個箭頭加以說明:

Transparent的代碼可以調用SafeCritical的代碼

SafeCritical的代碼可以調用Critical的代碼

Transparent的代碼不可以調用Critical的代碼


下面的代碼展示了安全級別的運作機制:

  1: using System;
2: using System.Security;
3: 
4: // 這個屬性使得assembly中沒有Security標記的方法默認為Transparent方法
5: [assembly:AllowPartiallyTrustedCallers]
6: 
7: namespace SecurityLevel
8: {
9:     public class Program
10:     {
11:         // 標記Foo為Critical方法。
12:         [SecurityCritical]
13:         static void Foo()
14:         {
15:             Console.WriteLine("Hello Foo");
16:         }
17: 
18:         static void Main()
19:         {
20:             // 這個調用會導致以下的異常:
21:             // Unhandled Exception: System.MethodAccessException: SecurityLevel.Program.Foo()
22:             // at SecurityLevel.Program.Main()
23:             Foo();
24:         }
25:     }
26: }

Main函數(shù)由于沒有任何安全屬性,而且在assembly上有AllowPartiallyTrustedCallers屬性,所以他的安全級別是Transparent,根據(jù)前文提及的安全機制,不能直接調用Critical函數(shù)Foo,于是命令行上顯示了異常信息。

應用安全級別構筑體用程序

CLR 4.0安全模型提供了這樣的一個機制,用戶只有正確使用這些機制,才能構筑健壯的應用程序。在這里,“正確的使用”指的是合理的設置函數(shù)的安全級別,對三個安全級別設置的指導原則如下:

Critical:通常用來執(zhí)行高危操作,比如對文件系統(tǒng)的讀寫。

SafeCritical:用來做安全方面的檢驗,或者只做限制性的操作。

Transparent:來自任何部分信任的程序代碼。

舉例來說,我們把三層模型應用到cookie的讀寫上,***層可以有一個Critical的函數(shù),用來在文件系統(tǒng)上寫一個cookie文件。中間層有一個SafeCritical,用于檢驗cookie操作的文件是否屬于特定的文件夾,就好像做一個安全檢查:如果通過了,則允許操作;否則的話就拒絕之。

下面的例子展示了一個簡化后的應用,從D盤的temp文件夾中刪除文件。請參見代碼中的注釋理解程序。

  1: using System;
2: using System.IO;
3: using System.Security;
4: 
5: // 這個屬性使得assembly沒有Security標記的方法默認為Transparent方法
6: [assembly:AllowPartiallyTrustedCallers]
7: 
8: namespace SecurityLevel
9: {
10:     public class Program
11:     {
12:         /// <summary>
13:         /// 該函數(shù)可以刪除文件系統(tǒng)上的任意函數(shù)。具有***的安全級別
14:         /// </summary>
15:         /// <param name="fileName">文件名</param>
16:         [SecurityCritical]
17:         static void DeleteFile(string fileName)
18:         {
19:             File.Delete(fileName);
20:         }
21: 
22:         /// <summary>
23:         /// 該函數(shù)驗證待刪文件是否在d:\temp中
24:         /// </summary>
25:         /// <param name="fileName">待刪文件名</param>
26:         [SecuritySafeCritical]
27:         static void DeleteFileFromTemp(string fileName)
28:         {
29:             if (fileName.StartsWith(@"d:\temp", StringComparison.CurrentCultureIgnoreCase)
30:             {
31:                 DeleteFile(fileName);
32:             }
33:             else
34:             {
35:                 throw new Exception("待刪文件不在temp文件夾中");
36:             }
37:         }
38: 
39:         static void Main()
40:         {
41:             // 該語句運行正常
42:             DeleteFileFromTemp(@"d:\temp\a.txt");
43: 
44:             // 該語句拋出異常
45:             DeleteFileFromTemp(@"d:\a.txt");
46:         }
47:     }
48: }
49:

安全級別和.NET類型系統(tǒng)

理解了安全級別的應用之后,我們來看看安全級別和.NET類型系統(tǒng)之間的關系:

安全級別和反射

反射機制提供了這樣三個屬性來探測一個類型(Type)和方法(MethodInfo)的安全級別

IsSecurityCritical { get; }  IsSecuritySafeCritical { get; }  IsSecurityTransparent { get; }

大家可以觀察到,這三個屬性是只讀的,因為通常境況下,編譯器會寫入了相關信息。

CLR 4.0安全模型的安全級別和繼承

以下兩點值得注意:關于類型,子類型的安全級別必須等于或者高于父類型的安全級別;關于方法,繼承的方法不能改變基類型方法的安全級別

安全級別和委托(Delegate)

調用者不能創(chuàng)建一個安全級別更高的Delegate,也不能創(chuàng)建一個指向安全級別更高方法的Delegate。

CLR 4.0安全模型小結

本文介紹了CLR4.0中引入的三層安全級別以及運作機制,示例了安全級別的設置原則,講述了安全級別和類型系統(tǒng)的關聯(lián)。

“CLR 4.0安全模型的運作機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI