c#2005net3.0高級編程(第5版)第19章,NET的安全性_第1頁
c#2005net3.0高級編程(第5版)第19章,NET的安全性_第2頁
c#2005net3.0高級編程(第5版)第19章,NET的安全性_第3頁
c#2005net3.0高級編程(第5版)第19章,NET的安全性_第4頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第1?ノ章.NET的安全性當(dāng)用戶坐在計算機(jī)前,單擊應(yīng)用程序上的按鈕時,應(yīng)用程序會在后臺作出響應(yīng),如果用戶試圖使用一個沒有相關(guān)模塊的特性,應(yīng)用程序就會與Internet連接,把模塊下載到全局程序集緩存中,并開始執(zhí)行模塊,所有的一切都沒有給出提示。這種后臺升級功能已經(jīng)在許多.NET應(yīng)用程序中使用了,但是,我們必須關(guān)注與所謂的“移動代碼(mobilecode)”相關(guān)的安全問題。也就是說,有什么證據(jù)能說明計算機(jī)下載的代碼是可以信任的?怎樣知道所下載的模塊就是我們需要的模塊?CLR在后臺做了什么工作,以確保Web站點上的控件沒有讀取私人的電子郵件?.NET執(zhí)行程序集的安全性策略。.NET根據(jù)它擁有的程序集信息(例如程序集來自哪里,它們是由誰發(fā)布的),把具有相似特征的程序集組合在ー起。例如,運行庫把本地內(nèi)聯(lián)網(wǎng)上的所有代碼放在ー組。然后,使用安全性策略(通常由系統(tǒng)管理員使用代碼訪問安全策略エ具caspol.exe命令行實用程序或Microsoft管理控制臺來定義)在非常小的粒度級別上決定應(yīng)該賦予代碼什么權(quán)限。需要做什么工作才能確保機(jī)器或某個應(yīng)用程序的安全?什么也不需要,因為所有的代碼都自動運行在CLR的安全環(huán)境中,但可以在必要時禁用安全性。除了相信正在執(zhí)行的代碼是可信賴的之外,還要允許應(yīng)用程序的用戶訪問他們需要的特性(但不要太多),這一點也是非常重要的。依靠基于角色的安全性,.NET可以對用戶和角色進(jìn)行有效的管理。本章將討論.NET中有助于管理安全的ー些特性,其中包括.NET怎樣避開有害的代碼、怎樣管理安全性策略,以及怎樣編程訪問安全子系統(tǒng)等。除此之外,還將討論怎樣安全地部署.NET應(yīng)用程序,并且給出ー些小的應(yīng)用程序示例,以鞏固本章介紹的概念。代碼訪問的安全性代碼訪問的安全性是.NET的ー個特性,它根據(jù)代碼的信任級別來管理代碼。如果CLR非常信賴代碼,允許它們運行,就會開始執(zhí)行代碼。但是,根據(jù)提供給程序集的權(quán)限,代碼也許要在有限制的環(huán)境中運行。如果代碼沒有得到足夠的信賴去運行,或者雖然代碼運行了,但試圖執(zhí)行沒有相關(guān)權(quán)限的操作,則會產(chǎn)生一個安全異常(其類型是SecurityException或它的子類)。代碼訪問的安全性系統(tǒng)意味著可以停止有害代碼的運行,也可以允許代碼運行在受保護(hù)的環(huán)境中,在受保護(hù)的環(huán)境中,我們相信代碼不會進(jìn)行破壞。例如,如果用戶試圖運行ー個應(yīng)用程序,執(zhí)行從!nternet上下載的代碼,則默認(rèn)的安全性策略將生成一個異常,該應(yīng)用程序會啟動失敗。同樣,如果用戶從網(wǎng)絡(luò)驅(qū)動器上運行應(yīng)用程序,則那個應(yīng)用程序可以運行,但是如果那個應(yīng)用程序試圖訪問本地驅(qū)動器上的文件,運行庫就會產(chǎn)生一個異常,根據(jù)應(yīng)用程序中處理錯誤的程序,應(yīng)用程序會退出對文件的訪問,或者退出執(zhí)行。対于大多數(shù)應(yīng)用程序而言,.NET代碼訪問的安全性都是非常有用的,但它在后臺起作用。代碼訪問的安全性提供了高水平的保護(hù),以遠(yuǎn)離有害的代碼,但是,通常我們涉及不到這個方面。而只考慮安全性策略的管理,尤其是在把桌面應(yīng)用程序配置為信賴提供應(yīng)用程序的軟件廠商的代碼時,就更要考慮安全性策略的管理。在開發(fā)應(yīng)用程序時,對于其中包含的元素,如果要嚴(yán)密地控制它們的安全性,則可以使用代碼訪問的安全性。例如,如果公司的數(shù)據(jù)庫中包含極其機(jī)密的數(shù)據(jù),則可以使用代碼訪問的安全性,規(guī)定什么代碼允許訪問數(shù)據(jù)庫,而什么代碼不允許訪問數(shù)據(jù)庫。代碼訪問的安全性的主要目的是保護(hù)資源(例如本地磁盤、網(wǎng)絡(luò)和用戶接口等)免受有害代碼的破壞,而不是使軟件免受用戶的破壞。対于與用戶相關(guān)的安全問題,通??梢允褂肳indows內(nèi)置的用戶安全子系統(tǒng),或者利用.NET中基于角色的安全性,這些內(nèi)容將在本章的后面討論。代碼訪問的安全性以兩個高層次的概念為基礎(chǔ),即代碼組(CodeGroup)和權(quán)限(Permission)。下面討論這兩個概念,因為它們構(gòu)成了后面章節(jié)的基礎(chǔ):?代碼組:代碼組用于把具有相似特征的代碼集合到ー組。通常,集合時所依據(jù)的最重要特征就是代碼來自哪里。例如,代碼組包括“Interneビ(代碼來自Internet)和“Intraneビ(代碼來自LAN)。把程序集放到代碼組中所使用的信息稱為“證據(jù)”。CLR收集的其他證據(jù)包括代碼的發(fā)布者、代碼的強(qiáng)名以及下載代碼的URI等。代碼組的排列是層次狀的,程序集總是與幾個代碼組相匹配。層次根部的代碼組稱為“AllCode”,包含其他所有的代碼組。層次用于確定程序集屬于哪ー個代碼組,如果程序集提供的證據(jù)與樹中的代碼組不匹配,則程序集不屬于樹的任何ー個代碼組。?權(quán)限:權(quán)限是允許每ー個代碼組執(zhí)行的動作。例如,權(quán)限包括“可以訪問用戶界面”和“可以訪問本地存儲器”等。系統(tǒng)管理員通常在Enterprise級、Machine級和User級上管理權(quán)限。CLR中的VirtualExecutionSystem用于載入和運行程序。VirtualExecutionSystem提供了執(zhí)行托管代碼所需要的功能,并使用程序集元數(shù)據(jù)把模塊在運行期間連接在ー起。當(dāng)VES載入程序集時,VES通常把程序集與一個或多個代碼組相匹配。每ー個代碼組都被賦予了一個或多個權(quán)限,指定各個代碼組中的程序集可以執(zhí)行什么動作。例如,如果MyComputer代碼組被賦予FilelOPermission權(quán)限,則意味著來自本地機(jī)器的程序集可以讀寫本地文件系統(tǒng)。代碼組代碼組有一個稱之為成員條件的入口需求(entryrequirement)?如果要把程序集劃歸某個代碼組,該程序集就必須符合那個代碼組的成員條件。例如,成員條件可以是“程序集來自http:〃站點”或“這個軟件的發(fā)布者是Microsoft公司”等。每ー個代碼組都有一個并且只有一個成員條件。在.NET中,代碼組可以使用的成員條件如下:Zone:代碼來自的區(qū)域Site:代碼來自的Web站點Strongname:代碼唯一的、可驗證的名稱。強(qiáng)名詳見第16章。Publisher:代碼發(fā)布者URL:代碼來自的具體位置Hashvalue:程序集的散列值Skipverification:請求Skipverification的代碼避開代碼驗證檢查。代碼的驗證可以確保代碼以定義合理和可接受的方式訪問類型。運行庫不能確保類型不安全的代碼是安全的。Applicationdirectory:程序集在應(yīng)用程序中的位置Allcode:符合條件的所有代碼Custom:與用戶相關(guān)的條件上述成員條件的第一個類型就是Zone,這個類型是最常用的。Zone是一段代碼區(qū)域的開端,表示下面的內(nèi)容:MyComputer,Internet,Intranet,Trusted或Untrusted。使用InternetExplorer中的安全選項可以對這些區(qū)域進(jìn)行管理,后面在討論怎樣管理安全性策略時,再討論這些內(nèi)容。雖然設(shè)置是在InternetExplorer中管理的,但是它們將應(yīng)用于整個機(jī)器。很明顯,那些配置選項在非Microsof1瀏覽器中是不能使用的,實際上,使用.NETFramework編寫的頁面控件只能在InternetExplorer上工作。代碼組的安排是層次狀的,根部是AllCode成員條件,如圖19-1所示。從這個圖中可以看出,每一個代碼組都有一個成員條件,并且指定賦予代碼組的權(quán)限。注意,如果程序集不符合代碼組中的成員條件,則CLR不會給它匹配那個代碼組ド面的代碼組。1.Caspol.exe——代碼訪問安全性策略工具本章將花大量的篇幅介紹命令行工具:代碼訪問安全性策略工具。要得到它的選項列表,只需輸入下面的命令:caspol.exe—?使用下面的命令把輸出發(fā)送給ー個文本文件:caspol.exe>output.txt.NET也包括ー個MicrosoftManagementConsole管理單元,它用于管理代碼訪問的安全性。但是,這里只使用命令行實用程序caspol.exe,以易于理解本章的示例,還可以創(chuàng)建腳本,更改安全性策略,在把策略應(yīng)用到大量的機(jī)器上時,這是非常有用的。使用caspol.exe,可以查看機(jī)器上的代碼組。caspol.exe的執(zhí)行結(jié)果是列出機(jī)器上代碼組的層次結(jié)構(gòu),并描述每ー個代碼組。鍵入如下命令:caspol.exe-listdescription另外,Jistdescription選項還有一個縮寫方式:?ld。下面是該命令的結(jié)果:Microsoft(R).NETFrameworkCasPol2.0.50215.44Copyright(C)MicrosoftCorporation.Allrightsreserved.SecurityisONExecutioncheckingisONPolicychangepromptisONLevel=MachineFullTrustAssemblies:All_Code:Codegroupgrantsnopermissionsandformstherootofthecodegrouptree.My_Computer_Zone:CodegroupgrantsfulltrusttoallcodeoriginatingonthelocalcomputerMicrosoft_Strong_Name:CodegroupgrantsfulltrusttocodesignedwiththeMicrosoftstrongname.ECMA_Strong_Name:CodegroupgrantsfulltrusttocodesignedwiththeECMAstrongname.LocalIntranet_Zone:Codegroupgrantstheintranetpermissionsettocodefromtheintranetzone.Thispermissionsetgrantsintranetcodetherighttouseisolatedstorage,fullUIaccess,somecapabilitytodoreflection,andlimitedaccesstoenvironmentvariables.Intranet_Same_Site_Access:Allintranetcodegetstherighttoconnectbacktothesiteofitsorigin.Intranet_Same__Directory_Access:Allintranetcodegetstherighttoreadfromitsinstalldirectory.Internet_Zone:CodegroupgrantscodefromtheInternetzonetheInternetpermissionset.ThispermissionsetgrantsInternetcodetherighttouseisolatedstorageandlimitedUIaccess.Internet_Same_Site_Access:AllInternetcodegetstherighttoconnectbacktothesiteofitsorigin.Restricted_Zone:Codecomingfromarestrictedzonedoesnotreceiveanypermissions.Trusted_Zone:CodefromatrustedzoneisgrantedtheInternetpermissionset.ThispermissionsetgrantstherighttouseisolatedstorageandlimitedUIaccess.Trusted__Same_Site_Access:AllTrustedCodegetstherighttoconnectbacktothesiteofitsorigin.Success.NET安全子系統(tǒng)確保每一個代碼組中的代碼只能做某些事情。例如,Internet區(qū)域中的代碼在默認(rèn)狀態(tài)下比本地驅(qū)動器中的代碼有更嚴(yán)格的限制;本地驅(qū)動器中的代碼通常有訪問本地磁盤上數(shù)據(jù)的權(quán)限,但是!nternet中的程序集在默認(rèn)狀態(tài)下就沒有這個權(quán)限。使用caspol.exe和它在MicrosoftManagementConsole中的等價選項,可以為每ー?個代碼訪問組指定信任級別,還可以按照更小的粒度方式管理代碼組和權(quán)限。再看看代碼訪問組,但是,這次的信息比上次要少ー些。確保以本地管理員身份登錄后,打開命令提示窗口,輸入下面的命令:caspol.exe-listgroups得到如下信息:Microsoft(R).NETFrameworkCasPol2.0.50215.44Copyright(C)MicrosoftCorporation.Allrightsreserved.SecurityisONExecutioncheckingisONPolicychangepromptisONLevel=MachineCodeGroups:Allcode:NothingZone-MyComputer:FullTrustStrongName-002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293:FullTrustStrongName-00000000000000000400000000000000:FullTrustZone-Intranet:LocallntranetAllcode:SamesiteWeb.Allcode:SamedirectoryFilelO-'Read,PathDiscovery,Zone-Internet:InternetAllcode:SamesiteWeb.Zone-Untrusted:NothingZone-Trusted:InternetAllcode:SamesiteWeb.Success在輸出結(jié)果的開頭,是SecurityisON。在本章后面的內(nèi)容中,我們將會看到Security可以先關(guān)閉,然后再打開。在默認(rèn)狀態(tài)下,ExecutionChecking設(shè)置的值是on,這意味著所有的程序集在運行之前,必須給它們賦予執(zhí)行權(quán)限。如果使用caspol(caspol.exe-executionon|off)關(guān)閉執(zhí)行檢查,則程序集沒有執(zhí)行權(quán)限也可以運行。在這種情況下,如果程序集在運行過程中有違背安全性策略的行為,就會產(chǎn)生安全異常。Policychangeprompt選項指定在更改安全性策略時,是否可以看到"Areyousure"警告信息。把代碼劃分為這些組之后,就可以更精細(xì)地管理安全性,還可以實現(xiàn)對更少代碼的完全信任。注意,每ー個組都有一個標(biāo)記(例如“1.2”),這些標(biāo)記是.NET自動生成的,在不同的機(jī)器上是不同的。通常不是按照每ー個程序集來管理安全性,而是使用代碼組來管理。如果一臺機(jī)器上同時安裝了幾個.NET版本,則caspol.exe只更改與它相關(guān)的.NET安裝版本的安全性策略。(1)查看程序集的代碼組如果程序集符合代碼組的成員條件,它們就屬于代碼組?;氐酱a組的示例中,從Web站點http://intranet/載入程序集,則它匹配的代碼組如圖19-2所示。這個程序集也是根代碼組(AUCode)的成員。如果程序集來自本地的網(wǎng)絡(luò),則它還是Intranet代碼組的成員;但是,當(dāng)從某一指定站點(如http://intranet)載入程序集時,它也被賦予FullTrust權(quán)限,這意味著程序集的運行沒有限制條件。圖!9-2使用如下命令,很容易查看程序集所屬的代碼組:caspol.exe-resolvegroupassembly.dll對本地磁盤上的程序集運行這個命令,可以得到如下結(jié)果:Microsoft(R).NETFrameworkCasPol2.0.50727.7Copyright(C)MicrosoftCorporation.Allrightsreserved.Level=EnterpriseCodeGroups:Allcode:FullTrustLevel=MachineCodeGroups:Allcode:NothingZone-MyComputer:FullTrustLevel=UserCodeGroups:Allcode:FullTrustSuccess注意,代碼組是在3個級別上列出的,這3個級別是Enterprise、Machine和User?,F(xiàn)在只關(guān)注Machine級別。如果要了解這3個級別之間的關(guān)系,賦予程序集的有效權(quán)限是這3個級別上權(quán)限的交集。例如,如果在Enterprise級別的策略中刪除了!nternet區(qū)域的FullTrust權(quán)限,則Internet區(qū)域中代碼的所有權(quán)限都被取消,其他兩個級別的設(shè)置就變得不相關(guān)了。現(xiàn)在,對這個程序集執(zhí)行caspol.exe命令,看看它所屬的代碼組。但是這次程序集是通過HTTP協(xié)議在Web服務(wù)器上訪問的,這樣,程序集成為不同代碼組的成員,它的權(quán)限受到更嚴(yán)格的限制:caspol.exe-resolvegrouphttp://server/assembly.dllMicrosoft(R).NETFrameworkCasPol2.0.50727.7Copyright(C)MicrosoftCorporation.Allrightsreserved.Level=EnterpriseCodeGroups:Allcode:FullTrustLevel=MachineCodeGroups:Allcode:NothingZone一!nternet:InternetAllcode:SamesiteWeb.Level=UserCodeGroups:Allcode:FullTrustSuccess程序集授予了!nternet權(quán)限和SameSiteWeb權(quán)限。權(quán)限的交集允許代碼對UI進(jìn)行有限的訪問,并可以連接到最初生成它的站點。下面詳細(xì)討論權(quán)限。19.1.2代碼訪問權(quán)限和權(quán)限集想像自己正在ー個大公司中管理辦公機(jī)器網(wǎng)絡(luò)的安全性策略。在這種情況下,CLR在執(zhí)行代碼之前收集代碼的證據(jù)是非常有用的;同樣,一旦CLR知道了代碼來自何處,管理員就必然有機(jī)會控制代碼在他管理的數(shù)百臺機(jī)器上的行為。這個問題需要使用權(quán)限來解決。一旦程序集與代碼組相匹配,CLR就會根據(jù)安全性策略賦予程序集一些權(quán)限。在Windows中管理權(quán)限時,通常不是把權(quán)限賦予用戶,而是把權(quán)限賦予用戶組。程序集也是如此,也就是說,把權(quán)限應(yīng)用于代碼組,而不是各個程序集,這就大大簡化了.NET中安全性策略的管理。安全性策略指定代碼組中的程序集允許執(zhí)行什么動作。下面列出了CLR提供的代碼訪問權(quán)限。從中可以看出,使用這些權(quán)限,可以很好地控制代碼允許做什么和不允許做什么:DirectoryServicesPermission:通城System.DirectoryServices類訪問ActiveDirectory的能力DnsPermission:使用TCP/IP域名系統(tǒng)(DNS)的能力EnvironmentPennission:讀寫環(huán)境變量的能力EventLogPermission:讀寫事件II志的能力FileDialogPermission:訪問用戶在Open對話框中選擇的文件的能力。通常用于沒有賦予FilelOPermission權(quán)限,不能對文件進(jìn)行有限的訪問時。FilelOPermission:處理文件的能力(其中包括讀文件、寫文件、添加文件的內(nèi)容,創(chuàng)建、更改和訪問文件夾)IsolatedStorageFilePermission:訪問私有虛擬文件系統(tǒng)的能力IsolatedStoragePermission:訪問孤立存儲器的能力,存儲器與各個用戶相關(guān),并具有代碼身份的ー些特征,孤立存儲器詳見第24章MessageQueuePermission:通過MicrosoftMessageQueue使用消息隊列的能力OleDbPermission:使用OLEDB提供程序訪問數(shù)據(jù)庫的能力PerformanceCounterPermission:利用性能計數(shù)器的能力Printingpermission:打印的能力ReflectionPermission:使用System.Reflection在運行期間查找類型信息的能力Registrypermission:讀、寫、創(chuàng)建和刪除注冊表項和值的能力SecurityPermission:執(zhí)行、斷皆權(quán)限、調(diào)用非托管的代碼、忽略驗證和其他權(quán)カ的能力ServiceControllerPermission:控制Windows服務(wù)的能力SocketPermission:在網(wǎng)絡(luò)傳輸?shù)刂飞蟿?chuàng)建或接受TCP/IP連接的能力SQLClientPermission:使用SQLServer的.NET數(shù)據(jù)提供程序訪問SQLServer數(shù)據(jù)庫的能力UlPetrnission:訪問用戶界面的能力WebPermission:連接Web或接受Web連接的能力對于上面的每ー個權(quán)限類,通??梢灾付ǜ罴墑e的粒度。例如,在本章后面的ー個示例中,請求的不僅僅是文件的訪問權(quán)限,還指定了文件訪問的具體級別。在實踐中,如果要利用與上面列出的權(quán)限相關(guān)的資源,最好在應(yīng)用程序中加入try...catch錯誤處理塊,以便應(yīng)用程序運行在受限制的權(quán)限下時,能夠很好地進(jìn)行處理。應(yīng)用程序的設(shè)計應(yīng)該指定應(yīng)用程序在這些情況下怎樣運行,而不應(yīng)該假定應(yīng)用程序運行在開發(fā)它時的同一安全性策略ド。例如,如果應(yīng)用程序不能訪問本地磁盤,它是應(yīng)該退出呢,還是以另ー種方式進(jìn)行工作呢?ー個程序集將與幾個代碼組相關(guān)聯(lián):在安全性策略中,程序集的有效權(quán)限是程序集所屬的所有代碼組中權(quán)限的并集。也就是說,程序集匹配的每ー個代碼組都將擴(kuò)展程序集的權(quán)限。在代碼組的樹中,下面的代碼組具有的權(quán)限比上面代碼組具有的權(quán)限要多一些。以代碼的身份為基礎(chǔ),CLR可以賦予代碼組另ー個權(quán)限集合。這些權(quán)限與CLR收集的關(guān)于程序集的證據(jù)直接相關(guān),它們稱為身份權(quán)限(IdentityPermissions)?下面是身份權(quán)限類的名稱:PublisherldentityPermission:軟件發(fā)布者的數(shù)字簽名SiteldentityPermission:Web站點的名稱,代碼來自這個Web站點StrongNameldentityPermission:程序集的強(qiáng)名URLIdentityPermission:URL,代碼來自這個URL(其中包括協(xié)議,例如http:〃)ZoneldentityPermission:程序集來自的區(qū)域把權(quán)限賦予代碼組,就不需要處理每個程序集了。通常在程序塊中應(yīng)用權(quán)限,這就是.NET提供權(quán)限集合的原因。代碼訪問的權(quán)限聚合在指定的集合中,ド面是已命名的權(quán)限集合:FullTrust:沒有權(quán)限的限制SkipVerification:不進(jìn)行驗證Execution:運行的能力,但是不能訪問受保護(hù)的資源Nothing:沒有權(quán)限,代碼不能執(zhí)行Locallntranct:本地內(nèi)部網(wǎng)的默認(rèn)策略,它是權(quán)限全集的子集。例如,文件IO只能在程序集生成的共享上進(jìn)行讀取訪問Internet:未知來源的代碼的默認(rèn)策略,這是限制最嚴(yán)格的策略。例如,在這個權(quán)限集合下執(zhí)行的代碼沒有文件10能力,不能讀寫事件日志,也不能讀寫環(huán)境變量Everything:這個集合中的所有權(quán)限,其中不包括忽略代碼驗證的權(quán)限。管理員可以改變這個權(quán)限集合中的權(quán)限。默認(rèn)策略要更強(qiáng)大時,可以使用這個權(quán)限集合注意:只能修改Everything權(quán)限集合的定義,而其他權(quán)限是固定的,不能改變。因為只有CLR能夠把身份權(quán)限賦予代碼,所以身份權(quán)限不能包括在權(quán)限集合中。例如,如果?段代碼是來自某個發(fā)布者,管理員把與另ー個發(fā)布者相關(guān)的身份權(quán)限賦予這段代碼是亳無意義的。CLR在需耍時賦予身份權(quán)限,這樣就可以隨時利用那些身份權(quán)限。1.查看程序集的權(quán)限代碼組:MicrosoftCorp.權(quán)限:FullTrust成員條件:Publisher圖!9-3代碼組:MyComputer

權(quán)限:FullTrust

成員條件:Zone假定用戶在使用ー個Microsoft應(yīng)用程序,并試圖使用ー個以前從沒用過的特性。應(yīng)用程序代碼組:MicrosoftCorp.權(quán)限:FullTrust成員條件:Publisher圖!9-3代碼組:MyComputer

權(quán)限:FullTrust

成員條件:Zone代碼組:Internet

權(quán)限:Internet

成員條件:Zone依照這個示例中的策略,代碼組AllCode和Internet的權(quán)限有限,但圖中右下角的代碼組卻賦予程序集FullTrust權(quán)限。程序集的有效權(quán)限是它所屬所有代碼組中權(quán)限的并集。當(dāng)權(quán)限以這種方式合并時,有效的權(quán)限就是被授予的最高權(quán)限,也就是說,程序集所屬的每ー個代碼組都會向程序集的有效權(quán)限集中添加權(quán)限。正像可以查看程序集所屬的代碼組ー樣,也可以查看賦予程序集所屬代碼組的權(quán)限。在查看權(quán)限時,不但能夠看到代碼的訪問權(quán)限(即允許代碼做什么),也可以看到代碼的身份權(quán)限(身份權(quán)限能訪問代碼在運行期間表現(xiàn)出來的證據(jù))。使用如下的命令,可以查看程序集代碼組的權(quán)限:caspol.exe-resolvepermassembly.dll對ー個程序集使用這個命令,并且查看在通過本地的內(nèi)部網(wǎng)訪問程序集時,賦予程序集的代碼訪問權(quán)限和身份權(quán)限。如果輸入下面的命令,就可以看到代碼訪問權(quán)限和3個身份權(quán)限:caspol.exe-resolvepermhttp://somehost/assembly.dllMicrosoft(R).NETFrameworkCasPol2.0.50727.7Copyright(C)MicrosoftCorporation.Allrightsreserved.Resolvingpermissionsforlevel=EnterpriseResolvingpermissionsforlevel=MachineResolvingpermissionsforlevel=UserGrant=<PermissionSetclass=nSystem.Security.PermissionSet"version=n1"><IPermissionclass="System.Security.Permissions.Environmentpermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"Version—1"Read="Username"/><IPermissionclass=nSystem.Security.Permissions.FileDialogPermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="1"Unrestricted=ntrue"/><IPermissionclass=nSystem.Security.Permissions.IsolatedStorageFilePermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089nversion="l"Al1owed="AssemblyIsolationByUsernUserQuota="9223372036854775807"Expiry="9223372036854775807nPermanent="True"/><IPermissionclass="System.Security.Permissions.Reflectionpermission,mscorlib,Version=",Culture=neutral,PublicKeyToken=b77a5c561934e089"Version="lFlags="ReflectionEmit"/><IPermissionclass="System.Security.Permissions.Securitypermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="1Flags="Assertion,Execution,BindingRedirects"/><IPermissionclass="System.Security.Permissions.UlPermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="lUnrestricted="true"/><IPermissionclass="System.Security.Permissions.SiteIdentitypermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="1Site="somehost"/><IPermissionclass="System.Security.Permissions.UriIdentitypermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="l"Ur1="http://somehost/assembly.dll"/><IPermissionclass="System.Security.Permissions.ZoneIdentitypermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="l"Zone="Intranet"/><IPermissionclass="System.Net.DnsPermission,System,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version="l"Unrestricted="true"/><IPermissionclass="System.Drawing.Printing.Printingpermission,System.Drawing,Version=,Culture=neutral,PublicKeyToken=b03f5f7flld50a3anversion="l"Level="DefaultPrinting"/><IPermissionclass="System.Net.WebPermission,System,Version=,Culture=neutral/PublicKeyToken=b77a5c561934e089nversion="l"><ConnectAccess><URIuri="(httpsIhttp)://somehost/.*[/]?"/></ConnectAccess></IPermission></PermissionSet>Success上面的權(quán)限都是以XML方式顯示出來的,其中包括定義權(quán)限的類、包含類的程序集、權(quán)限的版本以及加密標(biāo)記。從中可以看出,我們能夠創(chuàng)建自己的權(quán)限,此外,每ー個身份權(quán)限都包括更詳細(xì)的信息,例如UrlldentityPermission類的詳細(xì)信息,通過這個類可以訪問生成代碼的URL等。在輸出結(jié)果的開頭,要格外注意caspol.exe解決Enterprise,Machine和User級別上權(quán)限的方式和列出有效權(quán)限的方式。下面討論策略的這3個級別。19.1.3策略的級別:Machine,UserEnterprise前面討論的都是單機(jī)環(huán)境中的安全性。但通常需要對具體的用戶或整個公司指定安全性策略,這就是.NET不提供ー個代碼組級別,而是提供3個代碼組級別的原因:MachineEnterpriseUser3個代碼組級別是單獨管理、并行存在的,如圖19-4所示。如果有3個安全性策略,該應(yīng)用哪個策略?有效的權(quán)限就是3個策略級別上權(quán)限的交集。也就是說,每ー個策略級別都可以否決另ー個級別的權(quán)限,對于管理員來說,這是ー件好事,因為他們的設(shè)置可以覆蓋用戶的設(shè)置。為了使用caspol.exe處理User級別或Enterprise級別上的代碼組和權(quán)限,必須添加-enterprise參數(shù)或-user參數(shù),以改變命令的模式。默認(rèn)狀態(tài)ド,caspol.exe工作在Machine

級別上,到H前為止,我們ー一直在Machine級別上使用caspol.exe。下面的命令列出了User級別上的代碼組:caspol.exe-user-listgroups圖!9-4在默認(rèn)的安裝上,這個命令的執(zhí)行結(jié)果如下所示:SecurityisONExecutioncheckingisONPolicychangepromptisONLevel=UserCodeGroups:Allcode:FullTrustSuccess運行同樣的命令,但是這次看一下Enterprise級別上的代碼組:caspol.exe-enterprise-listgroups這個命令的執(zhí)行結(jié)果如下所示:SecurityisONExecutioncheckingisONPolicychangepromptisONLevel=EnterpriseCodeGroups:Allcode:FullTrustSuccess從中可以看出,在默認(rèn)狀態(tài)下,User級別和Enterprise級別都配置為允許給AllCode代碼組賦予FullTrust權(quán)限。其結(jié)果是,.NET安全性的默認(rèn)設(shè)置對Enterprise級別和User級別沒有任何限制,實際執(zhí)行的策略完全由Machine級別的安全性所決定。例如,如果要把比FullTrust限制更嚴(yán)格的權(quán)限或權(quán)限集賦予Enterprise級別或User級別,則那些限制條件將對所有的權(quán)限都起作用,并且有可能覆蓋Machine級別上的權(quán)限。由于有效的權(quán)限是所有權(quán)限的交集,因此,如果要把FullTrust應(yīng)用到代碼組上,就必須在3個策略級別上把這個權(quán)限賦予該代碼組。當(dāng)以管理員的身份運行caspol.exe時,caspol.exe把Machine級別作為默認(rèn)級別。但是,如果退出并以非Administrator用戶組中的用戶身份重新登錄,caspol.exe將使用User級別代替默認(rèn)的Machine級別。此外,如果用戶更改后的安全性使caspol.exe不能運行,caspol.exe就不允許用戶對安全性策略進(jìn)行改動?,F(xiàn)在,我們已經(jīng)對.NET的安全體系有了一定的了解,下面討論如何通過編程的方式利用代碼訪問的安全性。19.2對Framework中安全性的支持程序員在使用.NET的安全性時,必須信任CLR能夠很好地執(zhí)行安全性策略。當(dāng)調(diào)用的方法需要特定的權(quán)限(例如訪問本地磁盤上文件的權(quán)限)時,CLR將把調(diào)用放入堆棧中,以確保調(diào)用鏈上的每ー個調(diào)用者都能得到它們請求的權(quán)限。此時就要考慮性能了,但為了充分發(fā)揮托管環(huán)境(如.NET)的優(yōu)點,就必須犧牲一部分性能。另ー種方式是不完全可信的程序集可以調(diào)用完全可信的程序集,這樣,系統(tǒng)將很容易遭到攻擊。為了引用.NET的安全特性,本章中大多數(shù)應(yīng)用程序要使用.NETFramework庫中的命名空間:System.Security.PermissionsSystem.Security.PolicySystem.Security.Principal注意,基于證據(jù)的代碼訪問安全性是在Windows登錄安全性之后進(jìn)行工作的。如果要運行.NET桌面應(yīng)用程序,則必須賦予它相關(guān)的.NET代碼訪問安全性權(quán)限。但是,已登錄的用戶也必須是Windows賬戶的用戶,才有執(zhí)行代碼的權(quán)限。對于桌面應(yīng)用程序而言,這意味著當(dāng)前的用戶必須被賦予相關(guān)的權(quán)限,才能訪問磁盤上相關(guān)的程序集文件。對于Internet應(yīng)用程序而言,運行InternetInformationServer的賬戶必須能夠訪問程序集文件。

19.2.1要求權(quán)限為了說明要求權(quán)限的工作情況,下面創(chuàng)建一ー個WindowsForms應(yīng)用程序,它包含ー個按鈕,當(dāng)單擊按鈕時,就訪問本地文件系統(tǒng)上的ー個文件。如果應(yīng)用程序沒有訪問本地磁盤的相關(guān)權(quán)限(FilelOPermission),就把按鈕標(biāo)記為不可用(即把按鈕變?yōu)榛疑?。如果導(dǎo)入命名空間System.Security.Permissions,就把Forml類的構(gòu)造函數(shù)改為檢查權(quán)限:創(chuàng)建一個FilelOPermission對象,并調(diào)用這個對象的Demand。方法,然后對結(jié)果進(jìn)行操作:publicForml()(InitializeComponent();try(FilelOPermissionfileioperm=newFilelOPermission(FilelOPermissionAccess.AllAccess,@"c:\");filelOPermission.Demand();)catch(buttonl.Enabled=false;}FilelOPermission包含在System.Security.Permissions命名空間中。這個命名空間包含了權(quán)限的全集,除此之外,它還為聲明性的權(quán)限屬性提供了類,為用于創(chuàng)建權(quán)限對象的參數(shù)提供了枚舉值(例如,在創(chuàng)建FilelOPermission時,指定是需要完全訪問還是只讀訪問)。如果從本地磁盤中運行應(yīng)用程序(在默認(rèn)狀態(tài)下安全性策略允許訪問本地的存儲器),則應(yīng)用程序的運行情況如圖19-5所示。圖!9-5圖!9-5但是,如果把可執(zhí)行文件復(fù)制到網(wǎng)絡(luò)的共享區(qū)域,再次運行它,則應(yīng)用程序就處于LocalIntranet權(quán)限集中,這意味著應(yīng)用程序不能訪問本地的存儲器,按鈕將變?yōu)榛疑?如圖19-6所示。在單擊事件處理程序的實現(xiàn)代碼中,不需要檢查必要的安全性,因為.NETFramework中相關(guān)的類將請求文件權(quán)限,CLR將確保堆棧中的每ー個調(diào)用者在繼續(xù)工作之前都能得到那些權(quán)限。如果要從內(nèi)部網(wǎng)上運行應(yīng)用程序,試圖打開本地磁盤上的文件,除非安全性策略已經(jīng)更改為把本地磁盤的訪問權(quán)限賦予應(yīng)用程序,否則將產(chǎn)生異常。當(dāng)代碼試圖違反被賦予的權(quán)限時,CLR就會產(chǎn)生異常,捕獲到的異常是SecurityException類型,通過它可以訪問許多有用的信息,其中包括可讀的堆棧蹤跡(SecurityException.StackTrace)和對產(chǎn)生異常的方法的弓I用(SecurityException.TargetSite)〇SecurityException甚至還能提供SecurityException.PermissionType屬性,這個屬性返回導(dǎo)致發(fā)生安全異常的Permission對象的類型。如果在診斷安全異常時還有問題,則問題應(yīng)該發(fā)生在所調(diào)用的第一個部分。從上面的示例代碼中刪除try和catch塊,就可以看到安全異常。19.2.2請求權(quán)限從上面的內(nèi)容可以看出,要求權(quán)限指的是在運行期間明確聲明需要權(quán)限。但是,可以把程序集配置為在程序集開始執(zhí)行時請求權(quán)限,也就是說,在程序集執(zhí)行之前聲明它需要的權(quán)限??梢酝ㄟ^以下3種方式請求權(quán)限:最小權(quán)限:代碼運行時必需的權(quán)限可選權(quán)限:代碼可以使用這些權(quán)限,但是沒有這些權(quán)限,代碼仍然可以有效地運行拒絕權(quán)限:確保沒有賦予代碼的權(quán)限在程序集開始執(zhí)行時請求權(quán)限有以下幾個原因:如果程序集需要某些權(quán)限才能運行,則只有在程序集開始執(zhí)行時而不是在執(zhí)行期間聲明需要權(quán)限オ有意義,這樣可以確保用戶不會在程序開始工作后遇到障礙。只賦予所需的權(quán)限,不賦予其他任何權(quán)限。沒有明確的請求權(quán)限,程序集就會得到比執(zhí)行所需更多的權(quán)限。這會增加程序集被其他代碼用于惡意目的的可能性。如果只請求權(quán)限的最小集合,則可以增加程序集運行的可能性,因為不能預(yù)測最終用戶實際使用的安全策略。如果進(jìn)行比較復(fù)雜的部署,應(yīng)用程序很有可能安裝在沒有必需權(quán)限的機(jī)器上,在這種情況下,請求權(quán)限有可能是最有用的。通常,最好讓應(yīng)用程序在開始執(zhí)行時,就知道它沒有權(quán)限,而不是在執(zhí)行到ー半時オ知道。在VisualStudio2005中,可以選擇屬性的Security選項卡,檢查應(yīng)用程序的必需權(quán)限,如圖19-7所示。單擊CalculatePermissions按鈕會檢查程序集的代碼,列出所有的必需權(quán)限。除了使用VisualStudio之外,還可以使用命令行工具permcalc.exe,計算程序集的必需權(quán)限。這個工具是.NET2.0中新增的。命令行permcalc.exe-show-stacks-cleancacheDemandingPermissions.exe圖!9-7創(chuàng)建了一個包含所有必需權(quán)限的XML文件。選項ーshow表示立即打開XML文件。選項-stacks把堆棧信息添加到XML文件中,以查看權(quán)限請求來自何處。必需權(quán)限可以作為屬性添加到程序集中。下面的3個示例演示了怎樣使用屬性請求權(quán)限。如果使用下載的代碼,這些示例可以在RequestingPermissions項目中找到。第一個屬性請求把UlPermission權(quán)限賦予程序集,這個權(quán)限允許應(yīng)用程序訪問用戶界面。這里請求的是最小的權(quán)限集合,因此如果程序集沒有被賦予所請求的權(quán)限,就不能啟動:usingSystem.Security.Permissions;[assembly:UIPermissionAttribute{SecurityAction.RequestMinimum,Unrestricted=true)]接下來,有一個請求不讓程序集訪問c:'驅(qū)動器。這個屬性的設(shè)置意味著整個程序集不能訪問c:'驅(qū)動器:[assembly:FilelOPermissionAttribute(SecurityAction.RequestRefuse,Read=nC:/")]最后,使用屬性請求賦予程序集訪問非托管的代碼的權(quán)限,這個權(quán)限是可選的:[assembly:SecurityPermissionAttribute(SecurityAction.RequestOptional,Flags=SecurityPermissionFlag.UnmanagedCode)]如果應(yīng)用程序至少要在ー個地方訪問非托管的代碼,就應(yīng)把上面這個屬性添加到應(yīng)用程序中。在這種情況下,把權(quán)限指定為可選的,因此,應(yīng)用程序即使沒有訪問非托管代碼的權(quán)限,也可以正常運行。但是,如果程序集沒有被賦予訪問非托管代碼的權(quán)限,而程序集試圖訪問非托管的代碼,則將產(chǎn)生SecurityException異常,應(yīng)用程序應(yīng)該預(yù)料到這一點,并進(jìn)行相應(yīng)的處理。SecurityAction枚舉值的完整列表如表19-1所示,其中一些值將在后面詳細(xì)描述。表19-1SecurityAction枚舉說明Assert允許代碼訪問調(diào)用者不能訪問的資源Demand要求調(diào)用堆棧中的所有調(diào)用者有特定的權(quán)限D(zhuǎn)emandchoice要求調(diào)用堆棧中的所有調(diào)用者有一個特定的權(quán)限D(zhuǎn)eny迫使對某個權(quán)限的后續(xù)請求都失敗,拒絕該權(quán)限InhcritanccDcmand要求派生類擁有特定的權(quán)限LinkDemand要求當(dāng)前調(diào)用者有特定的權(quán)限LinkDemandChoice要求當(dāng)前調(diào)用者有?個特定的權(quán)限PermitOnly類似于Deny,沒有由PermitOnly明確列出的、對資源的后續(xù)請求都被拒絕RequestMinimum應(yīng)用于程序集,它包含程序集正確執(zhí)行所需要的權(quán)限RequestOptional應(yīng)用于程序集,它請求程序集可以使用的權(quán)限(如果有),以提供額外的特性和功能RcqucstRcfusc應(yīng)用于程序集,包含不希望程序集擁有的權(quán)限當(dāng)考慮應(yīng)用程序的權(quán)限需求時,通常必須選擇下面兩種情況中的ー種:?在開始執(zhí)行時請求需要的所有權(quán)限,如果沒有賦予那些權(quán)限,則退出執(zhí)行。?在開始執(zhí)行時不請求權(quán)限,但是執(zhí)行過程中一直準(zhǔn)備著處理安全異常。一旦使用權(quán)限屬性以上述方式配置程序集之后,就可以對包含程序集清單的程序集文件使用pcrmview.exe實用程序和-assembly選項查看權(quán)限:>permcalc.exe-show-assemblyRequestingPermissions.exe對應(yīng)用程序使用前面討論的3個屬性,執(zhí)行這個命令,可以得到如下結(jié)果:Microsoft(R).NETFrameworkPermissionsCalculator.Copyright(C)MicrosoftCorporation2004.Allrightsreserved.Analyzing...RequestingPermissions.exeMinimalpermissionset:<PermissionSetclass=nSystem.Security.PermissionSet”version=M1"><IPermissionclass=wSystem.Security.Permissions.UlPermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089nversion=*'1"Unrestricted=ntruen/></PermissionSet>Optionalpermissionset:<PermissionSetclass=nSystem.Security.PermissionSetnversion=M1"><IPermissionclass="System.Security.Permissions.Securitypermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089nversion="1"Flags=nSecurityPermissionFlag.UnmanagedCode"/></PermissionSet>Refusedpermissionset:<PermissionSetclass=nSystem.Security.PermissionSetnversion=M1"><IPermissionclass=nSystem.Security.Permissions.FilelOPermission,mscorlib,Version=,Culture=neutral,PublicKeyToken=b77a5c561934e089"version=TRead=nC:M/></PermissionSet>Generatingoutput...Writingfile:permcalc.exe.PermCalc.xml...除了可以請求權(quán)限之外,還可以請求完整的權(quán)限集,請求權(quán)限集的優(yōu)點是不必處理每個權(quán)限。但只能請求不能修改的權(quán)限集。Everything權(quán)限集能夠在程序集運行時通過安全性策略來改變,因此,不能請求這個權(quán)限集。下面的示例闡明了如何請求內(nèi)置的權(quán)限集:[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum,Name="FullTrust'*)]在這個示例中,程序集至少要請求內(nèi)置權(quán)限集FullTrust。如果程序集沒有被賦予這個權(quán)限集,則運行期間會拋出安全異常。隱式的權(quán)限在賦予權(quán)限時,通常有一些隱式的語句可以賦ア其他權(quán)限。例如,如果賦予了訪問c:\的權(quán)限FilelOPermission,就隱含著也可以訪問C:\的子目錄。如果要檢查賦予權(quán)限時是否隱式地賦予了其他的權(quán)限作為子集,可以使用下面的代碼://ExampleImplicitPermissionsclassProgram(staticvoidMain()(CodeAccessPermissionpermissionA=newFilelOPermission(FilelOPermissionAccess.AllAccess,@"C:\n);CodeAccessPermissionpermissions=newFilelOPermission(FilelOPermissionAccess.Read,@nC:\temp");if(permissionB.IsSubsetOf(permissionA)){Console.WriteLine("PermissionsisasubsetofPermissionA");|)}代碼的執(zhí)行結(jié)果如下:PermissionBisasubsetofPermissionA拒絕權(quán)限有些情況下,需要執(zhí)行ー項操作,并絕對確保所調(diào)用的方法在ー個受保護(hù)的環(huán)境中執(zhí)行。程序集不允許執(zhí)行未預(yù)料到的操作。例如,在調(diào)用第三方的類時,要確保它不會訪問本地磁盤。為此,可以創(chuàng)建一個權(quán)限的實例,并確保沒有給它授予Deny()方法,然后,在調(diào)用權(quán)限類之前,首先調(diào)用權(quán)限類的Deny()方法://ExampleDenyingPermissionsusingSystem;usingSystem.10;usingSystem.Security;usingSystem.Security.Permissions;namespaceWrox.ProCSharp.Security{classProgram(staticvoidMain(){CodeAccessPermissionpermission=newFilelOPermission(FilelOPermissionAccess.AllAccess,@"C:\");permission.Deny();UntrustworthyClass.Method();CodeAccessPermission.RevertDeny();})classUntrustworthyClass{publicstaticvoidMethod()(try(StreamReaderdin=File.OpenText(0"C:\textfile.txt");catchConsole.WriteLine("Failedtoopenfile");)}))如果執(zhí)行這段代碼,結(jié)果將顯示出“Failedtoopenfile”這樣的信息,原因是不可信的類沒有訪問本地磁盤的權(quán)限。注意,Deny。是在permission對象的實例上調(diào)用的,而RevertDenyO是靜態(tài)調(diào)用的。其原因是RevertDeny。冋復(fù)當(dāng)前堆棧幀中所有的拒絕請求,如果多次調(diào)用了Deny。,則只需調(diào)用一次RevertDeny()o斷言權(quán)限假定有一個完全可信的程序集安裝在用戶的系統(tǒng)上。在程序集中,有一個方法用于把審計信息保存到本地磁盤上的文本文件中。如果以后安裝一個要利用審計特性的應(yīng)用程序,則那個應(yīng)用程序必須擁有相關(guān)的FilelOPermission權(quán)限,才能把數(shù)據(jù)保存到磁盤上。這似乎很過分,但我們的目的是對本地磁盤的操作進(jìn)行嚴(yán)格限制。如果具有有限權(quán)限的程序集調(diào)用更加可信的程序集,則可以暫時增大堆棧上權(quán)限的范圍,這樣,更加可信的程序集就可以代表本身沒有權(quán)限的調(diào)用程序執(zhí)行ー些操作。為此,更加可信的程序集可以斷言它們需要的權(quán)限。如果程序集具有它需要的權(quán)限以斷言額外的權(quán)限,則調(diào)用程序在堆棧中就不需要擁有更大范圍的權(quán)限。下面的代碼包含了一個AuditClass類,這個類執(zhí)行Save()方法,Save。方法接收ー個字符串,并且把審計數(shù)據(jù)保存到C:\audit.txt文件中。AuditClass方法斷言它需要的權(quán)限,以便把審計行添加到文件中。為了進(jìn)行測試,應(yīng)用程序的Main()方法顯式地拒絕了Audit方法需要的文件訪問權(quán)限://ExampleAssertingPermissionsusingSystem;usingSystem.10;usingSystem.Security;usingSystem.Security.Permissions;namespaceWrox.ProCSharp.Security(classProgram(staticvoidMain()(CodeAccessPermissionpermission=newFilelOPermission(FilelOPermissionAccess.Append,@nC:\audit.txt");permission.Deny();AuditClass.Save("somedatatoaudit");CodeAccessPermission.RevertDeny();}classAuditclass(publicstaticvoidSave(stringvalue)(try(FilelOPermissionpermission=newFilelOPermission(FilelOPermissionAccess.Append,@"C:\audit.txt");permission.Assert();FileStreamstream=newFileStream(@"C:\audit.txtn,FileMode.Append,FileAccess.Write);//codetowritetoauditfilehere...CodeAccessPermission.RevertAssert();Console.WriteLine("Datawrittentoauditfile");}catch(Console.WriteLine("Failedtowritedatatoauditfile");}}))在執(zhí)行上面的代碼時,對AuditClass方法的調(diào)用并不會拋出安全異常,即使在調(diào)用AuditClass方法時,它沒有訪問本地磁盤的權(quán)限,情況還是如此。與RevertDeny()一樣,RevertAssert。也是靜態(tài)的方法。在目前的架構(gòu)中,RevertAssert()方法也要回復(fù)所有的斷言。使用斷言時必須非常小心。我們顯式地把權(quán)限賦予ー個方法,這個方法被其他沒有那些權(quán)限的代碼所調(diào)用,可能會產(chǎn)生一個安全漏洞。例如,在審計示例中,即使安全性策略指出已安裝的應(yīng)用程序不能把數(shù)據(jù)寫到本地磁盤上,如果審計程序集為寫入數(shù)據(jù)斷言了FilelO-Permissions,程序集仍能把數(shù)據(jù)寫到本地磁盤上。為了進(jìn)行斷言,審計程序集在安裝時必須帶有FilelOAccess和SecurityPennission〇SecurityPermission允許程序集進(jìn)行斷言,程序集需要SecurityPermission和耍斷言的權(quán)限オ能成功完成。.NETFramework中的ー個這方面的例子是,ー些類在調(diào)用Win32Api或COM組件時,需要非托管代碼的訪問權(quán)限。而這些類的調(diào)用程序不需要非托管代碼的訪問權(quán)限,調(diào)用程序需耍的權(quán)限由這些類提供。創(chuàng)建代碼訪問權(quán)限.NETFramework執(zhí)行代碼訪問安全權(quán)限,那些權(quán)限可以保護(hù).NETFramework中的資源。有時,在創(chuàng)建自己的權(quán)限時,可以通過CodeAccessPermission的派生類執(zhí)行那些權(quán)限。從CodeAccessPermission中派生出來的定制權(quán)限類可以實現(xiàn)與.NET代碼訪問安全系統(tǒng)相同的功能,其中包括堆棧和策略管理。在下面兩種情況下,需要創(chuàng)建自己的代碼訪問權(quán)限:?保護(hù)Framework沒有保護(hù)的資源。例如,要為家庭自動化開發(fā)ー個通過板上硬件設(shè)備來執(zhí)行的.NET應(yīng)用程序,就可以創(chuàng)建自己的代碼訪問權(quán)限,對家庭自動化硬件進(jìn)行很嚴(yán)格的訪問控制。?提供比現(xiàn)有權(quán)限更精細(xì)的管理。例如,盡管.NETFramework提供了允許対本地文件系統(tǒng)進(jìn)行粒度控制的權(quán)限,但是,有時需要對特定的文件或文件夾進(jìn)行更多的控制。在這種情況下,就需要創(chuàng)建與該文件或文件夾相關(guān)的代碼訪問權(quán)限。如果沒有那些權(quán)限,則所有的托管代碼將不能訪問磁盤的那些區(qū)域。.y聲明的安全性通過調(diào)用.NETFramework中的類,可以拒絕、請求和斷言權(quán)限,除此之外,還可以使用屬性,聲明指定權(quán)限需求。使用聲明安全性的最大好處是通過反射可以訪問設(shè)置信息。對于系統(tǒng)管理員而言,這也是非常有益處的,因為他們需要經(jīng)常查看應(yīng)用程序的安全需求。例如,可以指定一個方法,它必須具有從C:、目錄下讀取數(shù)據(jù)的權(quán)限才能執(zhí)行,其代碼如下所示://ExampleDeclarativeSecurityusingSystem;usingSystem.Security.Permissions;namespaceWrox.ProCSharp.SecurityclassProgram(staticvoidMain()(MyClass.Method();}[FilelOPermission(SecurityAction.Assert,Read="C:/")]classMyClass(publicstaticvoidMethod()(//implementationgoeshere}))注意,如果使用屬性斷言或請求權(quán)限,就不能捕捉到操作失敗時引發(fā)的異常,因為在try-catch-finally子句中沒有放置命令式代碼。安全策略的管理雖然.NET的安全特性比以前在Windows中的安全特性更加先進(jìn),但還是有一些局限性:.NET安全策略不能在非托管代碼上執(zhí)行(盡管.NET安全策略對非托管代碼的調(diào)用提供了一些保護(hù)措施)。如果用戶把程序集復(fù)制到本地機(jī)器上,則程序集將具有FullTrust權(quán)限,安全策略將被忽略。為了解決這個問題,可以對賦予本地代碼的權(quán)限進(jìn)行限制。.NET安全策略對基于腳本的病毒和有害的Win32.exe文件的處理幾乎沒有幫助,Microsoft是以與.NET安全策略不同的方式處理它們的。例如,Outlook的最新版本不允許從電子郵件中運行可執(zhí)行文件。但是,.NET可以幫助操作系統(tǒng)做出?些智能性的決定,例如代碼的信賴級別和代碼的來源(如內(nèi)部網(wǎng)應(yīng)用程序、Web頁面上的控件、通過!nternet從軟件廠商那里下載的WindowsForms應(yīng)用程序等)。安全配置文件如前所述,3個級別的安全策略(即Enterprise>Machine和User)把代碼組、權(quán)限和權(quán)限集連接起來。.NET中的安全配置信息保存在XML配置文件中,這個文件受Windows安全策略保護(hù)。例如,HWAdministrator,PowerUser和SYSTEMWindows組中的用戶能夠修改Machine級別的安全策略。保存安全策略的文件位置如下所示:Enterprise策略配置<windir>\Microsoft.NET\Framework\<version>\Config\enterprise.configMachine策略配置<windir>\Microsoft.NET\Framework\<version>\Config\security.configUser策略配置%USERPROFILE%\applicationdata\Microsoft\CLRsecurityconfig\<version>\security.config子目錄〈version〉隨著安裝在機(jī)器上的.NETFramework版本的不同而有所變化。必要時,可以手動編輯這些配置文件。例如,當(dāng)管理員需要為沒有登錄到他們賬戶的用戶配置安全策略時,就需要手動編輯配置文件。但是,一般而言,最好使用caspol.exe或.NETFrameworkConfigurationMMC管理單元中的RuntimeSecurituPolicy節(jié)點來管理安全策略。有了所有的準(zhǔn)備知識后,下面創(chuàng)建一個簡單的應(yīng)用程序,這個應(yīng)用程序?qū)⒃L問本地驅(qū)動器,對本地驅(qū)動器的訪問操作是需要認(rèn)真管理的。這個應(yīng)用程序是C#WindowsForms應(yīng)用程序,它包含?個列表框和一個按鈕,如圖19-8所示。如果單擊這個按鈕,則C:\animals.txt文件中的內(nèi)容將填寫到列表框中。在啟動應(yīng)用程序之前,必須把這個文件復(fù)制到該文件夾中。在WindowsVista中,文件是c:\users\<usemame>\Documents\animals.txt;在WindowsXP中,文件是c:\DocumentsandSettings\<usemame>\MyDocuments\animals.txt。這個應(yīng)用程序是使用VisualStudio2005創(chuàng)建的,唯一的改動是把列表框和LoadData按鈕添加到窗體上,并給按鈕添加了一個事件,其代碼如下所示://ExamplefromSimpleExampleprivatevoidOnLoadData(objectsender.System.EventArgse)(stringfilename=Environment.G

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論