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頁
c#2005net3.0高級編程(第5版)第19章,NET的安全性_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第19章

,NET的安全性

當用戶坐在計算機前,單擊應用程序上的按鈕時,應用程序會在后臺作出響應,如果

用戶試圖使用一個沒有相關模塊的特性,應用程序就會與Internet連接,把模塊下載到全

局程序集緩存中,并開始執(zhí)行模塊,所有的?切都沒有給出提示。

這種后臺升級功能己經在許多.NET應用程序中使用了,但是,我們必須關注與所謂的

“移動代碼(mobilecode)”相關的安全問題。也就是說,有什么證據能說明計算機下載的

代碼是可以信任的?怎樣知道所下載的模塊就是我們需要的模塊?CLR在后臺做了什么

工作,以確保Web站點上的控件沒有讀取私人的電子郵件?

,NET執(zhí)行程序集的安全性策略。.NET根據它擁有的程序集信息(例如程序集來自哪里,

它們是由誰發(fā)布的),把具有相似特征的程序集組合在一起。例如,運行庫把本地內聯(lián)網上

的所有代碼放在一組。然后,使用安全性策略(通常由系統(tǒng)管理員使用代碼訪問安全策略工

具caspol.exe命令行實用程序或Microsoft管理控制臺來定義)在非常小的粒度級別上決定應

該賦予代碼什么權限。需要做什么工作才能確保機器或某個應用程序的安全?什么也不需

要,因為所有的代碼都自動運行在CLR的安全環(huán)境中,但可以在必要時禁用安全性。

除了相信正在執(zhí)行的代碼是可信賴的之外,還要允許應用程序的用戶訪問他們需要的

特性(但不要太多),這一點也是非常重要的。依靠基于角色的安全性,.NET可以對用戶和

角色進行有效的管理。

本章將討論.NET中有助于管理安全的一些特性,其中包括.NET怎樣避開有害的代碼、

怎樣管理安全性策略,以及怎樣編程訪問安全子系統(tǒng)等.除此之外,還將討論怎樣安全地

部署.NET應用程序,并且給出一些小的應用程序示例,以鞏固本章介紹的概念。

19.1代碼訪問的安全性

代碼訪問的安全性是.NET的一個特性,它根據代碼的信任級別來管理代碼。如果CLR

非常信賴代碼,允許它們運行,就會開始執(zhí)行代碼。但是,根據提供給程序集的權限,代

碼也許要在有限制的環(huán)境中運行。如果代碼沒有得到足夠的信賴去運行,或者雖然代碼運

行了,但試圖執(zhí)行沒有相關權限的操作,則會產生一個安全異常(其類型是SecurityException

或它的子類)。代碼訪問的安全性系統(tǒng)意味著可以停止有害代碼的運行,也可以允許代碼運

第m部分基類庫

行在受保護的環(huán)境中,在受保護的環(huán)境中,我們相信代碼不會進行破壞。

例如,如果用戶試圖運行一個應用程序,執(zhí)行從Internet上下載的代碼,則默認的安

全性策略將生成一個異常,該應用程序會啟動失敗。同樣,如果用戶從網絡驅動器上運行

應用程序,則那個應用程序可以運行,但是如果那個應用程序試圖訪問本地驅動器上的文

件,運行庫就會產生個異常,根據應用程序中處理錯誤的程序,應用程序會退出對文

件的訪問,或者退出執(zhí)行。

對于大多數應用程序而言,.NET代碼訪問的安全性都是非常有用的,但它在后臺起作

用。代碼訪問的安全性提供了高水平的保護,以遠離有害的代碼,但是,通常我們涉及不

到這個方面。而只考慮安全性策略的管理,尤其是在把桌面應用程序配置為信賴提供應用

程序的軟件廠商的代碼時,就更要考慮安全性策略的管理。

在開發(fā)應用程序時,對于其中包含的元素,如果要嚴密地控制它們的安全性,則可以

使用代碼訪問的安全性。例如,如果公司的數據庫中包含極其機密的數據,則可以使用代

碼訪問的安全性,規(guī)定什么代碼允許訪問數據庫,而什么代碼不允許訪問數據庫。

代碼訪問的安全性的主要目的是保護資源(例如本地磁盤、網絡和用戶接口等)免受有

害代碼的破壞,而不是使軟件免受用戶的破壞。對于與用戶相關的安全問題,通??梢允?/p>

用Windows內置的用戶安全子系統(tǒng),或者利用.NET中基于角色的安全性,這些內容將在

本章的后面討論。

代碼訪問的安全性以兩個高層次的概念為基礎,即代碼組(CodeGroup)和權限

(Permission)。下面討論這兩個概念,因為它們構成了后面章節(jié)的基礎:

?代碼組:代碼組用于把具有相似特征的代碼集合到一組。通常,集合時所依據的

最重要特征就是代碼來自哪里。例如,代碼組包括“Internet”(代碼來自Internet)

和“Intranet”(代碼來自LAN)。把程序集放到代碼組中所使用的信息稱為“證據”。

CLR收集的其他證據包括代碼的發(fā)布者、代碼的強名以及下載代碼的URI等。代

碼組的排列是層次狀的,程序集總是與幾個代碼組相匹配。層次根部的代碼組稱為

"AllCode,包含其他所有的代碼組。層次用于確定程序集屬于哪一個代碼組,如

果程序集提供的證據與樹中的代碼組不匹配,則程序集不屬于樹的任何一個代碼組。

?權限:權限是允許每?個代碼組執(zhí)行的動作。例如,權限包括“可以訪問用戶界

面”和“可以訪問本地存儲器”等。系統(tǒng)管理員通常在Enterprise級、Machine

級和User級上管理權限。

CLR中的VirtualExecutionSystem用于載入和運行程序。VirtualExecutionSystem提

供了執(zhí)行托管代碼所需要的功能,并使用程序集元數據把模塊在運行期間連接在一起。當

VES載入程序集時,VES通常把程序集與一個或多個代碼組相匹配。每一個代碼組都被賦

予了一個或多個權限,指定各個代碼組中的程序集可以執(zhí)行什么動作。例如,如果

MyComputer代碼組被賦予FilelOPermission權限,則意味著來自本地機器的程序集可以讀

寫本地文件系統(tǒng)。

19.1.1代碼組

代碼組有一個稱之為成員條件的入口需求(entryrequirement)?如果要把程序集劃歸某

542

個代碼組,該程序集就必須符合那個代碼組的成員條件。例如,成員條件可以是“程序集

來自http:〃www.microsoftcom站點”或“這個軟件的發(fā)布者是Microsoft公司”等。

每一個代碼組都有一個并且只有一個成員條件。在.NET中,代碼組可以使用的成員

條件如下:

?Zone:代碼來自的區(qū)域

?Site:代碼來自的Web站點

?Strongname:代碼唯一的、可驗證的名稱。強名詳見第16章。

?Publisher:代碼發(fā)布者

?URL:代碼來自的具體位置

?Hashvalue:程序集的散列值

?Skipverification:請求Skipverification的代碼避開代碼驗證檢查。代碼的驗證可以

確保代碼以定義合理和可接受的方式訪問類型。運行庫不能確保類型不安全的代

碼是安全的。

?Applicationdirectory:程序集在應用程序中的位置

?Allcode:符合條件的所有代碼

?Custom:與用戶相關的條件

上述成員條件的第一個類型就是Zone,這個類型是最常用的。Zone是一段代碼區(qū)域

的開端,表示下面的內容:MyComputer>Internet,Intranet、Trusted或Untrusted。使用Internet

Explorer中的安全選項可以對這些區(qū)域進行管理,后面在討論怎樣管理安全性策略時,再

討論這些內容。雖然設置是在InternetExplorer中管理的,但是它們將應用于整個機器。很

明顯,那些配置選項在非Microsoft瀏覽器中是不能使用的,實際上,使用.NETFramework

編寫的頁面控件只能在InternetExplorer上工作。

代碼組的安排是層次狀的,根部是AllCode成員條件,如圖19-1所示。從這個圖中可

以看出,每一個代碼組都有一個成員條件,并且指定賦予代碼組的權限。注意,如果程序

集不符合代碼組中的成員條件,則CLR不會給它匹配那個代碼組下面的代碼組。

圖19-1

第m部分基類庫

1.Caspol.exe——代碼訪問安全性策略工具

本章將花大量的篇幅介紹命令行工具:代碼訪問安全性策略工具。要得到它的選項列

表,只需輸入下面的命令:

caspol.exe—?

使用下面的命令把輸出發(fā)送給一個文本文件:

caspol.exe>output.txt

.NET也包括一個MicrosoftManagementConsole管理單元,它用于管理代碼訪問的安

全性。但是,這里只使用命令行實用程序caspol.exe,以易于理解本章的示例,還可以創(chuàng)建

腳本,更改安全性策略,在把策略應用到大量的機器上時,這是非常有用的。

使用caspol.exe,可以查看機器上的代碼組。caspol.exe的執(zhí)行結果是列出機器上代碼

組的層次結構,并描述每一個代碼組。鍵入如下命令:

caspol.exe-listdescription

另外,listdescription選項還有,個縮寫方式:-Id。下面是該命令的結果:

Microsoft(R).NETFrameworkCasPol2.0.50215.44

Copyright(C)MicrosoftCorporation.Allrightsreserved.

SecurityisON

ExecutioncheckingisON

PolicychangepromptisON

Level=Machine

FullTrustAssemblies:

1.All__Code:Codegroupgrantsnopermissionsandformstherootofthecode

grouptree.

1.1.My_Computer_Zone:Codegroupgrantsfulltrusttoallcodeoriginating

onthelocalcomputer

1.1.1.Microsoft_Strong_Name:Codegroupgrantsfulltrusttocodesigned

withtheMicrosoftstrongname.

1.1.2.ECMA_Strong_Name:Codegroupgrantsfulltrusttocodesignedwith

theECMAstrongname.

1.2.LocalIntranet_Zone:Codegroupgrantstheintranetpermissionsetto

codefromtheintranetzone.Thispermissionsetgrantsintranetcode

therighttouseisolatedstorage,fullUIaccess,somecapabilitytodo

reflection,andlimitedaccesstoenvironmentvariables.

1.2.1.Intranet_Same_Site_Access:Allintranetcodegetstherightto

connectbacktothesiteofitsorigin.

1.2.2.Intranet_Same__Directory_Access:Allintranetcodegetstherightto

readfromitsinstalldirectory.

1.3.Internet_Zone:CodegroupgrantscodefromtheInternetzonethe

Internetpermissionset.ThispermissionsetgrantsInternetcodetheright

544

touseisolatedstorageandlimitedUIaccess.

1.3.1.Internet_Same_Site_Access:AllInternetcodegetstherightto

connectbacktothesiteofitsorigin.

1.4.Restricted_Zone:Codecomingfromarestrictedzonedoesnotreceiveany

permissions,

1.5.Trusted_Zone:CodefromatrustedzoneisgrantedtheInternet

permissionset.Thispermissionsetgrantstherighttouseisolated

storageandlimitedUIaccess.

1.5.1.Trusted_Same_Site_Access:AllTrustedCodegetstherightto

connectbacktothesiteofitsorigin.

Success

.NET安全子系統(tǒng)確保每一個代碼組中的代碼只能做某些事情。例如,Internet區(qū)域中

的代碼在默認狀態(tài)下比本地驅動器中的代碼有更嚴格的限制;本地驅動器中的代碼通常有

訪問本地磁盤上數據的權限,但是Internet中的程序集在默認狀態(tài)下就沒有這個權限。

使用caspol.exe和它在MicrosoftManagementConsole中的等價選項,可以為每一個代

碼訪問組指定信任級別,還可以按照更小的粒度方式管理代碼組和權限。

再看看代碼訪問組,但是,這次的信息比上次要少一些。確保以本地管理員身份登錄

后,打開命令提示窗口,輸入下面的命令:

caspol.exe-listgroups

得到如下信息:

Microsoft(R).NETFrameworkCasPol2.0.50215.44

Copyright(C)MicrosoftCorporation.Allrightsreserved.

SecurityisON

ExecutioncheckingisON

PolicychangepromptisON

Level=Machine

CodeGroups:

1.Allcode:Nothing

1.1.Zone-MyComputer:FullTrust

1.1.1.StrongName-

002400000480000094000000060200000024000052534131000400000100010007D1FA57C4A

ED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD2

36132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F16

45C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A124365

18206DC093344D5AD293:FullTrust

1.1.2.StrongName-00000000000000000400000000000000:FullTrust

1.2.Zone-Intranet:Locallntranet

1.2.1.Allcode:SamesiteWeb.

1.2.2.Allcode:SamedirectoryFilelO-*Read,PathDiscovery'

1.3.Zone-Internet:Internet

1.3.1.Allcode:SamesiteWeb.

第HI部分基類庫

1.4.Zone-Untrusted:Nothing

1.5.Zone-Trusted:Internet

1.5.1.Allcode:SamesiteWeb.

Success

在輸出結果的開頭,是SecurityisON。在本章后面的內容中,我們將會看到Security

可以先關閉,然后再打開。

在默認狀態(tài)下,ExecutionChecking設置的值是。n,這意味著所有的程序集在運行之

前,必須給它們賦予執(zhí)行權限。如果使用caspol(caspol.exe-executionon|off)關閉執(zhí)行檢查,

則程序集沒有執(zhí)行權限也可以運行。在這種情況下,如果程序集在運行過程中有違背安全

性策略的行為,就會產生安全異常。

Policychangeprompt選項指定在更改安全性策略時,是否可以看到"Areyousure"警告

信息。

把代碼劃分為這些組之后,就可以更精細地管理安全性,還可以實現(xiàn)對更少代碼的完

全信任。注意,每一個組都有一個標記(例如“1.2”),這些標記是.NET自動生成的,在不

同的機器上是不同的。通常不是按照每一個程序集來管理安全性,而是使用代碼組來管理。

如果一臺機器上同時安裝了幾個.NET版本,則caspol.exe只更改與它相關的.NET安

裝版本的安全性策略。

(1)查看程序集的代碼組

如果程序集符合代碼組的成員條件,它們就屬于代碼組?;氐酱a組的示例中,從

Web站點http://intranet/載入程序集,則它匹配的代碼組如圖19-2所示。這個程序集也是根

代碼組(AllCode)的成員。如果程序集來自本地的網絡,則它還是Intranet代碼組的成員;

但是,當從某一指定站點(如http://intranet)載入程序集時,它也被賦予FullTrust權限,這

意味著程序集的運行沒有限制條件。

圖19-2

使用如下命令,很容易查看程序集所屬的代碼組:

caspol.exe-resolvegroupassembly.dll

546

對本地磁盤上的程序集運行這個命令,可以得到如下結果:

Microsoft(R).NETFrameworkCasPol2.0.50727.7

Copyright(C)MicrosoftCorporation.Allrightsreserved.

Level=Enterprise

CodeGroups:

1.Allcode:FullTrust

Level=Machine

CodeGroups:

1.Allcode:Nothing

1.1.Zone-MyComputer:FullTrust

Level=User

CodeGroups:

1.Allcode:FullTrust

Success

注意,代碼組是在3個級別上列出的,這3個級別是Enterprise、Machine和User?,F(xiàn)

在只關注Machine級別。如果要了解這3個級別之間的關系,賦予程序集的有效權限是這

3個級別上權限的交集。例如,如果在Enterprise級別的策略中刪除了Internet區(qū)域的

FullTrust權限,則Internet區(qū)域中代碼的所有權限都被取消,其他兩個級別的設置就變得

不相關了。

現(xiàn)在,對這個程序集執(zhí)行caspol.exe命令,看看它所屬的代碼組。但是這次程序集是

通過HTTP協(xié)議在Web服務器上訪問的,這樣,程序集成為不同代碼組的成員,它的權限

受到更嚴格的限制:

caspol.exe-resolvegrouphttp://server/assembly.dll

Microsoft(R).NETFrameworkCasPol2.0.50727.7

Copyright(C)MicrosoftCorporation.Allrightsreserved.

Level=Enterprise

CodeGroups:

1.Allcode:FullTrust

Level=Machine

CodeGroups:

第HI部分基類庫

1.Allcode:Nothing

1.1.Zone-Internet:Internet

1.1.1.Allcode:SamesiteWeb.

Level=User

CodeGroups:

1.Allcode:FullTrust

Success

程序集授予了Internet權限和SameSiteWeb權限。權限的交集允許代碼對UI進行有

限的訪問,并可以連接到最初生成它的站點。

下面詳細討論權限。

19.1.2代碼訪問權限和權限集

想像自己正在一個大公司中管理辦公機器網絡的安全性策略。在這種情況下,CLR在

執(zhí)行代碼之前收集代碼的證據是非常有用的;同樣,一旦CLR知道了代碼來自何處,管理

員就必然有機會控制代碼在他管理的數百臺機器上的行為。這個問題需要使用權限來解決。

一旦程序集與代碼組相匹配,CLR就會根據安全性策略賦予程序集一些權限。在

Windows中管理權限時,通常不是把權限賦予用戶,而是把權限賦予用戶組。程序集也是

如此,也就是說,把權限應用于代碼組,而不是各個程序集,這就大大簡化了.NET中安全

性策略的管理。

安全性策略指定代碼組中的程序集允許執(zhí)行什么動作。下面列出了CLR提供的代碼訪

問權限。從中可以看出,使用這些權限,可以很好地控制代碼允許做什么和不允許做什么:

?DirectoryServicesPermission:通過System.DirectoryServices類訪問ActiveDirectory的

能力

?DnsPermission:使用TCP/IP域名系統(tǒng)(DNS)的能力

?EnvironmentPcnnission:讀寫環(huán)境變量的能力

?EventLogPermission:讀寫事件IJ志的能力

?FileDialogPermission:訪問用戶在Open對話框中選擇的文件的能力。通常用于

沒有賦予FilelOPermission權限,不能對文件進行有限的訪問時。

?FilelOPermission:處理文件的能力(其中包括讀文件、寫文件、添加文件的內容,

創(chuàng)建、更改和訪問文件夾)

?IsolatcdStoragcFilcPcrmission:訪問私有虛擬文件系統(tǒng)的能力

?IsolatedStoragePennission:訪問孤立存儲器的能力,存儲器與各個用戶相關,并具

有代碼身份的一些特征,孤立存儲器詳見第24章

?MessageQueuePermission:通過MicrosoftMessageQueue使用消息隊列的能力

?OlcDbPcnnission:使用OLEDB提供程序訪問數據庫的能力

?PerfbrmanceCounterPermission:利用性能計數器的能力

548

?Printingpermission:打印的能力

?ReflectionPermission:使用System.Reflection在運行期間查找類型信息的能力

?RegistryPermission:讀、寫、創(chuàng)建和刪除注冊表項和值的能力

?SecurityPermission:執(zhí)行、斷言權限、調用非托管的代碼、忽略驗證和其他權力的

能力

?ServiceControllerPermission:控制Windows服務的能力

?SocketPermission:在網絡傳輸地址上創(chuàng)建或接受TCP/IP連接的能力

?SQLClientPermission:使用SQLServer的.NET數據提供程序訪問SQLServer數據

庫的能力

?UlPermission:訪問用戶界面的能力

?WebPermission:連接Web或接受Web連接的能力

對于上面的每一個權限類,通??梢灾付ǜ罴墑e的粒度。例如,在本章后面的一個

示例中,請求的不僅僅是文件的訪問權限,還指定了文件訪問的具體級別。

在實踐中,如果要利用與上面列出的權限相關的資源,最好在應用程序中加入

try...catch錯誤處理塊,以便應用程序運行在受限制的權限下時,能夠很好地進行處理。應

用程序的設計應該指定應用程序在這些情況下怎樣運行,而不應該假定應用程序運行在開

發(fā)它時的同一安全性策略下。例如,如果應用程序不能訪問本地磁盤,它是應該退出呢,

還是以另一種方式進行工作呢?

一個程序集將與幾個代碼組相關聯(lián);在安全性策略中,程序集的有效權限是程序集所

屬的所有代碼組中權限的并集。也就是說,程序集匹配的每一個代碼組都將擴展程序集的

權限。在代碼組的樹中,下面的代碼組具有的權限比上面代碼組具有的權限要多一些。

以代碼的身份為基礎,CLR可以賦予代碼組另一個權限集合。這些權限與CLR收集

的關于程序集的證據直接相關,它們稱為身份權限(IdentityPermissions)。下面是身份權

限類的名稱:

?PublishcrldentityPcnnission:軟件發(fā)布者的數字簽名

?SiteldentityPermission:Web站點的名稱,代碼來自這個Web站點

?StrongNamcIdentityPcrmission:程序集的強名

?URLIdentityPermission:URL,代碼來自這個URL(其中包括協(xié)議,例如http://)

?ZoneldentityPermission:程序集來自的區(qū)域

把權限賦予代碼組,就不需要處理每個程序集了。通常在程序塊中應用權限,這就

是.NET提供權限集合的原因。代碼訪問的權限聚合在指定的集合中,卜一面是已命名的權限

集合:

?FullTrust:沒有權限的限制

?SkipVerification:不進行驗證

?Execution:運行的能力,但是不能訪問受保護的資源

?Nothing:沒有權限,代碼不能執(zhí)行

?Locallntranet:本地內部網的默認策略,它是權限全集的子集。例如,文件10只能

在程序集生成的共享上進行讀取訪問

第m部分基類庫

?Internet:未知來源的代碼的默認策略,這是限制最嚴格的策略。例如,在這個權

限集合下執(zhí)行的代碼沒有文件10能力,不能讀寫事件日志,也不能讀寫環(huán)境變量

?Everything:這個集合中的所有權限,其中不包括忽略代碼驗證的權限。管理員可

以改變這個權限集合中的權限。默認策略要更強大時,可以使用這個權限集合

注意:

只能修改Everything權限集合的定義,而其他權限是固定的,不能改變。

因為只有CLR能夠把身份權限賦予代碼,所以身份權限不能包括在權限集合中。例如,

如果?段代碼是來自某個發(fā)布者,管理員把與另一個發(fā)布者相關的身份權限賦予這段代碼

是毫無意義的。CLR在需要時賦予身份權限,這樣就可以隨時利用那些身份權限。

1.查看程序集的權限

假定用戶在使用一個Micros。任應用程序,并試圖使用一個以前從沒用過的特性。應用

程序沒有把代碼的副本保存在本地,因此必須在Internet上請求代碼,然后下載到全局程

序集緩存中。如果代碼是由特定的公司(這個公司已經使用證書簽署了程序集)通過Internet

發(fā)布的,則程序集所屬代碼組中的成員關系如圖19-3所示。

圖19-3

依照這個示例中的策略,代碼組AllCode和Internet的權限有限,但圖中右下角的代

碼組卻賦予程序集FullTrust權限。程序集的有效權限是它所屬所有代碼組中權限的并集。

當權限以這種方式合并時,有效的權限就是被授予的最高權限,也就是說,程序集所屬的

每一個代碼組都會向程序集的有效權限集中添加權限。

正像可以查看程序集所屬的代碼組一樣,也可以查看賦予程序集所屬代碼組的權限。

在查看權限時,不但能夠看到代碼的訪問權限(即允許代碼做什么),也可以看到代碼的身份

權限(身份權限能訪問代碼在運行期間表現(xiàn)出來的證據)。使用如下的命令,可以查看程序集

代碼組的權限:

550

caspol.exe-resolvepermassembly.dll

對一個程序集使用這個命令,并且查看在通過本地的內部網訪問程序集時,賦予程序

集的代碼訪問權限和身份權限。如果輸入下面的命令,就可以看到代碼訪問權限和3個

身份權限:

caspol.exe-resolvepermhttp://somehost/assembly.dll

Microsoft(R).NETFrameworkCasPol2.0.50727.7

Copyright(C)MicrosoftCorporation.Allrightsreserved.

Resolvingpermissionsforlevel=Enterprise

Resolvingpermissionsforlevel=Machine

Resolvingpermissionsforlevel=User

Grant=

<PermissionSetclass=nSystem.Security.PermissionSet

version=nln>

<IPermissionclass=nSystem.Security.Permissions.Environmentpermission,

mscorlib,Version=,Culture=neutralz

PublicKeyToken=b77a5c561934e089nVersion=n1"Read="Usernamen/>

<IPermissionclass=nSystem.Security.Permissions.FileDialogPeEmission,

mscorlib,Version=,Culture=neutralz

PublicKeyToken=b77a5c561934e089"

version="1"Unrestricted=111rue"/>

<IPermissionclass=HSystem.Security.Permissions.IsolatedStorageFilePermission,

mscorlib,Version=,Culture=neutralz

PublicKeyToken=b77a5c561934e089nversion=n1”

Allowed=nAssemblyIsolationByUser*'

UserQuota=n9223372036854775807nExpiry=n9223372036854775807M

Permanent='*Truen/>

<IPermissionclass=,1System.Security.Permissions.Reflectionpermission,

mscorlib,Version=n,Culture=neutral,

PublicKeyToken=b77a5c561934e089nVersion=H1n

Flags='*ReflectionEmit0/>

<IPermissionclass=nSystem.Security.Permissions.SecurityPermission,

mscorlib,Version=,Culture=neutral,

PublicKeyToken=b77a5c561934e089nversion=n1”

Flags=nAssertion,Execution,BindingRedirects1'/>

<IPermissionclass="System.Security.Permissions.UIPermission,

mscorlib,Version=,Culture=neutralz

PublicKeyToken=b77a5c561934e089nversion=n1n

Unrestricted=ntrue"/>

<工Permissionclass=nSystem.Security.Permissions.SiteIdentitypermission,

mscorlib,Version=,Culture=neutral,

PublicKeyToken=b77a5c561934e089nversion=n1”

Site="somehost"/>

(工Permissionclass="System.Security.Permissions.UrlldentityPermission,

mscorlib,Version=,Culture=neutralz

PublicKeyToken=b77a5c561934e089nversion=n1n

第HI部分基類庫

Url=*'http://somehost/assembly.dll"/>

<IPermissionclass=nSystem.Security.Permissions.ZoneIdentitypermission,

mscorlib,Version=,Culture=neutral,

PublicKeyToken=b77a5c561934e089nversion="1

Zone="Intranetn/>

<IPermissionclass=,,System.Net.DnsPermission,

System,Version=,Culture=neutral,

PublicKeyToken=b77a5c561934e089nversion=n1*'

Unrestricted='*truen/>

〈工Permissionclass=nSystem.Drawing.Printing.Printingpermission,

System.Drawing,Version=,Culture=neutralz

PublicKeyToken=b03f5f7fHd50a3anversion=n1**

Level=nDefaultPrinting"/>

<IPermissionclass=nSystem.Net.WebPermission,

System,Version=,Culture=neutralz

PublicKeyToken=b77a5c561934e089nversion=n1**>

<ConnectAccess>

<URIuri=H(httpsIhttp)://somehost/.*[/]?"/>

</ConnectAccess>

</IPermission>

</PermissionSet>

Success

上面的權限都是以XML方式顯示出來的,其中包括定義權限的類、包含類的程序集、

權限的版本以及加密標記。從中可以看出,我們能夠創(chuàng)建自己的權限,此外,每一個身份

權限都包括更詳細的信息,例如UrlldentityPermission類的詳細信息,通過這個類可以訪問

生成代碼的URL等。

在輸出結果的開頭,要格外注意caspol.exe解決Enterprise、Machine和User級別上權

限的方式和列出有效權限的方式。下面討論策略的這3個級別。

19.1.3策略的級別:Machine^User和Enterprise

前面討論的都是單機環(huán)境中的安全性。但通常需要對具體的用戶或整個公司指定安全

性策略,這就是.NET不提供一個代碼組級別,而是提供3個代碼組級別的原因:

?Machine

?Enterprise

?User

3個代碼組級別是單獨管理、并行存在的,如圖19-4所示。

如果有3個安全性策略,該應用哪個策略?有效的權限就是3個策略級別上權限的交

集?也就是說,每一個策略級別都可以否決另一個級別的權限,對于管理員來說,這是一

件好事,因為他們的設置可以覆蓋用戶的設置。

為了使用caspol.exe處理User級別或Enterprise級別上的代碼組和權限,必須添加

-enterprise參數或-user參數,以改變命令的模式。默認狀態(tài)卜,caspol.exe工作在Machine

552

級別上,到目前為止,我們一直在Machine級別上使用caspol.exe0下面的命令列出了User

級別上的代碼組:

caspol.exe-user-listgroups

圖19-4

在默認的安裝上,這個命令的執(zhí)行結果如下所示:

SecurityisON

ExecutioncheckingisON

PolicychangepromptisON

Level=User

CodeGroups:

1.Allcode:FullTrust

Success

運行同樣的命令,但是這次看一下Enterprise級別上的代碼組:

caspol.exe-enterprise-listgroups

這個命令的執(zhí)行結果如下所示:

SecurityisON

ExecutioncheckingisON

第HI部分基類庫

PolicychangepromptisON

Level=Enterprise

CodeGroups:

1.Allcode:FullTrust

Success

從中可以看出,在默認狀態(tài)下,User級別和Enterprise級別都配置為允許給AllCode

代碼組賦予FullTrust權限。其結果是,.NET安全性的默認設置對Enterprise級別和User

級別沒有任何限制,實際執(zhí)行的策略完全由Machine級別的安全性所決定。例如,如果要

把比FullTrust限制更嚴格的權限或權限集賦予Enterprise級別或User級別,則那些限制條

件將對所有的權限都起作用,并且有可能覆蓋Machine級別上的權限。由于有效的權限是

所有權限的交集,因此,如果要把FullTrust應用到代碼組上,就必須在3個策略級別上把

這個權限賦予該代碼組。

當以管理員的身份運行caspol.exe時,caspol.exe把Machine級別作為默認級別。但是,

如果退出并以非Administrator用戶組中的用戶身份重新登錄,caspol.exe將使用User級別

代替默認的Machine級別。此外,如果用戶更改后的安全性使caspol.exe不能運行,caspol.exe

就不允許用戶對安全性策略進行改動。

現(xiàn)在,我們已經對.NET的安全體系有了一定的了解,下面討論如何通過編程的方式利

用代碼訪問的安全性。

19.2對Framework中安全性的支持

程序員在使用.NET的安全性時,必須信任CLR能夠很好地執(zhí)行安全性策略。當調用

的方法需要特定的權限(例如訪問本地磁盤上文件的權限)時,CLR將把調用放入堆棧中,

以確保調用鏈上的每一個調用者都能得到它們請求的權限。

此時就要考慮性能了,但為了充分發(fā)揮托管環(huán)境(如.NET)的優(yōu)點,就必須犧牲一部分

性能。另一種方式是不完全可信的程序集可以調用完全可信的程序集,這樣,系統(tǒng)將很容

易遭到攻擊。

為了引用.NET的安全特性,本章中大多數應用程序要使用.NETFramework庫中的命

名空間:

?System.Security.Permissions

?System.Security.Policy

?System.Security.Principal

注意,基于證據的代碼訪問安全性是在Windows登錄安全性之后進行工作的。如果要

運行.NET桌面應用程序,則必須賦予它相關的.NET代碼訪問安全性權限。但是,已登錄

的用戶也必須是Windows賬戶的用戶,才有執(zhí)行代碼的權限。對于桌面應用程序而言,

這意味著當前的用戶必須被賦予相關的權限,才能訪問磁盤上相關的程序集文件。對于

Internet應用程序而言,運行InternetInformationServer的賬戶必須能夠訪問程序集文件。

554

19.2.1要求權限

為了說明要求權限的工作情況,下面創(chuàng)建一個WindowsForms應用程序,它包含一個

按鈕,當單擊按鈕時,就訪問本地文件系統(tǒng)上的一個文件。如果應用程序沒有訪問本地磁

盤的相關權限(FilelOPermission),就把按鈕標記為不可用(即把按鈕變?yōu)榛疑?。

如果導入命名空間System.Security.Permissions,就把Form1類的構造函數改為檢查權

限:創(chuàng)建一個FilelOPermission對象,并調用這個對象的Demand。方法,然后對結果進行

操作:

publicForml()

(

InitializeComponent();

try

(

FilelOPermissionfileioperm=new

FilelOPermission(FilelOPermissionAccess.AllAccess,0*'c:\**);

filelOPermission.Demand();

}

catch

(

buttonl.Enabled=false;

}

}

FilelOPennission包含在System.Security.Permissions命名空間中。這個命名空間包含了

權限的全集,除此之外,它還為聲明性的權限屬性提供了類,為用于創(chuàng)建權限對象的參數

提供了枚舉值(例如,在創(chuàng)建FilelOPermission時,指定是需要完全訪問還是只讀訪問)。

如果從本地磁盤中運行應用程序(在默認狀態(tài)下安全性策略允許訪問本地的存儲器),

則應用程序的運行情況如圖19-5所示。

圖19-5圖19-6

但是,如果把可執(zhí)行文件復制到網絡的共享區(qū)域,再次運行它,則應用程序就處于

Localintranet權限集中,這意味著應用程序不能訪問本地的存儲器,按鈕將變?yōu)榛疑?,?/p>

圖19-6所示。

在單擊事件處理程序的實現(xiàn)代碼中,不需要檢查必要的安全性,因為.NETFramework

中相關的類將請求文件權限,CLR將確保堆棧中的每一個調用者在繼續(xù)工作之前都能得到

那些權限。如果要從內部網上運行應用程序,試圖打開本地磁盤上的文件,除非安全性策

略已經更改為把本地磁盤的訪問權限賦予應用程序,否則將產生異常。

第m部分基類庫

當代碼試圖違反被賦予的權限時,CLR就會產生異常,捕獲到的異常是

SecurityExc叩tion類型,通過它可以訪問許多有用的信息,其中包括可讀的堆棧蹤跡

(SecurityException.StackTrace)和對'產生異常的方法的引用(SecurityException.TargetSite)。

SecurityException甚至還能提供SecurityException.PermissionType屬性,這個屬性返回導致

發(fā)生安全異常的Permission對象的類型。如果在診斷安全異常時還有問題,則問題應該發(fā)

生在所調用的第一個部分。從上面的示例代碼中刪除try和catch塊,就可以看到安全異常。

19.2.2請求權限

從上面的內容可以看出,要求權限指的是在運行期間明確聲明需要權限。但是,可以

把程序集配置為在程序集開始執(zhí)行時請求權限,也就是說,在程序集執(zhí)行之前聲明它需要

的權限。

可以通過以下3種方式請求權限:

?最小權限:代碼運行時必需的權限

?可選權限:代碼可以使用這些權限,但是沒有這些權限,代碼仍然可以有效地運

?拒絕權限:確保沒有賦予代碼的權限

在程序集開始執(zhí)行時請求權限有以下幾個原因:

?如果程序集需要某些權限才能運行,則只有在程序集開始執(zhí)行時而不是在執(zhí)行期

間聲明需要權限才有意義,這樣可以確保用戶不會在程序開始工作后遇到障礙。

?只賦予所需的權限,不賦予其他任何權限。沒有明確的請求權限,程序集就會得

到比執(zhí)行所需更多的權限。這會增加程序集被其他代碼用于惡意目的的可能性。

?如果只請求權限的最小集合,則可以增加程序集運行的可能性,因為不能預測最

終用戶實際使用的安全策略。

如果進行比較復雜的部署,應用程序很有可能安裝在沒有必需權限的機器上,在這種

情況下,請求權限有

溫馨提示

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

評論

0/150

提交評論