Tải bản đầy đủ (.pdf) (10 trang)

Các giải pháp lập trình CSharp- P64 ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.65 MB, 10 trang )

521
Chương 13: Bảo mật
nắm được các mặt hạn chế của một thư viện mà bạn muốn gọi từ mã lệnh của
bạn.


Sử dụng công cụ
Permissions View
(
Permview.exe
—được cấp cùng với .
NET
Framework SDK
).
l%2&.6.e$8&*N&IN9'';
.Sgcode access permission requirementsh(.&'.&*)=i@*'
l'G(.&'=$';Q:)
&*lD8&*N&I(.&'*&VK9'4O)
  '    =    .      &i  *  I  g@  )3  I  *  
System.Security.SecurityException
h
P4Permview.exe.MIM.49F8&*F;(.
'>N9'&gdeclarative permission requesth$*&>.(.&'E
&t.'>NDgminimum requesth8'>Ne'0goptional requesth8'>N
*Qgrefusal requesthu2)8)<'&.ND8.'>Ne'
08.'>N*Q\
using System.Net;
using System.Security.Permissions;
// Yêu cầu quyền tối thiểu: SocketPermission.
[assembly:SocketPermission(SecurityAction.RequestMinimum,
Unrestricted = true)]


// Yêu cầu quyền tùy chọn: SecurityPermission.
[assembly:SecurityPermission(SecurityAction.RequestOptional,
Unrestricted = true)]
// Yêu cầu loại trừ quyền: FileIOPermission.
[assembly:SecurityPermission(SecurityAction.RequestRefuse,
Unrestricted = true)]
public class PermissionViewExample {
public static void Main() {
// Làm gì đó
}
}
7= 
permview PermissionViewExample.exe
 @  I;"!)e
4.'<&*3F0I;;i'>N9'$
*&C(.&'"#&'>N9'ED8e'08*QE
$ > )  .> >   $ I   C  )* XML . D$
System.Security.PermissionSet

522
Chương 13: Bảo mật
Microsoft (R) .NET Framework Permission Request Viewer.
Version 1.1.4322.510
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
minimal permission set:
<PermissionSet class="System.Security.PermissionSet" version="1">
<IPermission class="System.Net.SocketPermission, System,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1" Unrestricted="true"/>
</PermissionSet>

optional permission set:
<PermissionSet class="System.Security.PermissionSet" version="1">
<IPermission class="System.Security.Permissions.SecurityPermission,
mscorlib, Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
</PermissionSet>
refused permission set:
<PermissionSet class="System.Security.PermissionSet" version="1">
<IPermission class="System.Security.Permissions.SecurityPermission,
mscorlib, Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
</PermissionSet>

Bằng cách chỉ định đối số
/decl
khi chạy tiện ích
Permview.exe
, bạn có thể xem
tất cả các lệnh bảo mật khai báo (
declarative security statement
) nằm trong một
assembly. Việc này cho thấy rõ những gì assembly thực hiện bên trong và cho
phép bạn cấu hình chính sách bảo mật một cách phù hợp. Tuy nhiên,
Permview.exe
không hiển thị các thao tác bảo mật bắt buộc (
imperative security
operation
) nằm trong một assembly. Hiện không có cách nào để trích và tổng kết
các thao tác bảo mật bắt buộc được thực thi bên trong một assembly.
7.

7.
Xác đ nh mã l nh có quy n nào đó lúc th c thi hay khôngị ệ ề ự
Xác đ nh mã l nh có quy n nào đó lúc th c thi hay khôngị ệ ề ự


Bạn cần xác định assembly của bạn có một quyền cụ thể nào đó lúc thực thi hay
không.
523
Chng 13: Bo mt


To v cu hỡnh quyn m bn mun kim tra ri truyn nú cho phng thc
tnh
IsGranted
ca lp
System.Security.SecurityManager
.
|O)'>N9'D8&*Făàãàộ&=(.&'6
9'S$JiTI.S&**'8&*F/5FF
9'DS$'>N7'>8&*F.D=.:vF2
+M-:)F:vFJ&=(.&'
&*9'Ơẫ$PI6'$2:F.N&5'>
N9'e'08X&*iq.69'..S&*F
ỉ)I2&.6G8ạƠễƠĐÔĐÊầ-đố-ỉƠ Ơ
Ơ ƠễêẻƠg.Z^`S%&'I'>N9'e'0h
uD'>N9'e'0&=4Fv&
(.&'5FSK9'L*FO).Ơêã$z&z
&* . >. ;4 0 Ô )3 I *
System.Security.SecurityException
7'>8@9M;i;(.&*F

9'NI'4|F8&*FéèÔố- ã.S
0Ơà>$z&z.@<' )=>*&
.6l*.S)<'%&'O)M:
IsGranted
;i;(.
(.&'*F9'.C:\Data'4L*F*. 0
I.#&*N.9'8@9MIO)i6
BI6. %&IFX )ef('4
// nh ngha mt bin lun lý cho bit assembly cú quyn
// truy xut ghi i vi th mc C:\Data hay khụng.
bool canWrite = false;

// To v cu hỡnh mt i tng FileIOPermission mụ t quyn
// truy xut ghi i vi th mc C:\Data.
System.Security.Permissions.FileIOPermission fileIOPerm =
new System.Security.Permissions.FileIOPermission(
System.Security.Permissions.FileIOPermissionAccess.Write,
@"C:\Data");

// Kim tra assembly hin ti cú quyn ó c ch nh hay khụng.
canWrite = System.Security.SecurityManager.IsGranted(fileIOPerm);
8.
8.
H n ch ai ú th a k cỏc l p c a b n
H n ch ai ú th a k cỏc l p c a b n
v chộp ố cỏc thnh viờn l p
v chộp ố cỏc thnh viờn l p


Bn cn kim soỏt nhng ai cú th tha k cỏc lp ca bn thụng qua s tha k

(
inheritance
) v mt lp dn xut cú th chộp ố nhng thnh viờn no.
524
Chương 13: Bảo mật


Sử dụng các lệnh bảo mật khai báo (
declarative security statement
) để áp dụng
thành viên
SecurityAction.InheritanceDemand
vào phần khai báo của các lớp và
các thành viên bạn cần bảo vệ.
P.)f(
sealed
8
public
8
private
8
virtual
X&*.v
'QI&*X1>F7'>8
.)f('4*84Fv00*K.S
FQI.!X1>Fu2)8&*.DJK
.S)4''&*I%.FQI908
!JK.S$*Q.'&%.FQIM:
FL5)
InheritanceDemand

&'>8&*FJ
i9'gG=h..F%.FQI&*!X
1>FH589'.9'(.&'
.'$&F
"!)e&*F'>N&…9''69'
InheritanceDemand
8
4 '>N9'i)gidentity permissionhY'i).4
::gevidenceh).(.&' &=HI.(.&'
::FG*8&=@=(.&''9'i)e
$Y' i  ) X  &* O  )   & .6  &/ &    &
gimperativedeclarativesecuritystatementh =I9'Ii&.6gsecurity
decisionhv:>i).Sgcode identityh.4N=ID
$::LZ^zZ>9'i)$*.#::
g::>4>
System.Security.Policy
89'i
)>4>
System.Security.Permissions
h
Bảng 13.1
Các lớp chứng cứ và các quyền định danh
Lớp chứng cứ Quyền định danh
ApplicationDirectory
w4
Hash
w4
Publisher PublisherIdentityPermission
Site SiteIdentityPermission
StrongName StrongNameIdentityPermission

Url UrlIdentityPermission
Zone ZoneIdentityPermission

Bộ thực thi gán các quyền định danh cho một assembly dựa trên chứng cứ do
assembly này đưa ra. Bạn không thể gán thêm quyền định danh cho một
assembly thông qua việc cấu hình chính sách bảo mật.
L*O)G&.6&gdeclarativesecurity syntaxh=.
InheritanceDemand
8>&*O)&!2gattribute counterparth
9'.&*.D'>N79'F.&!2*
525
Chương 13: Bảo mật
  &  .6    &E&  t. 
InheritanceDemand
  u2  )8  &    !  2  
PublisherIdentityPermission
  
PublisherIdentityPermissionAttribute
8 &!
2
StrongNameIdentityPermission

StrongNameIdentityPermissionAttribute
E
9'&!2Ge(9'!>>
e4>
l.K.SFQI&*8S')
InheritanceDemand
&l*.S)<'%&'.$&&5
InheritanceDemand


7(F8JK&>(.&'$B&C&(z(f( g5.
f( pubcert.cerh%.FQI 
InheritanceDemandExample
H)f(
pubcert.cer $0G&>)i84:=NI$/
(.&'
[PublisherIdentityPermission(SecurityAction.InheritanceDemand,
CertFile = @"I:\CSharp\Chuong13\pubcert.cer")]
public class InheritanceDemandExample {
§
}
l.K.SFX1>F8&*S')
InheritanceDemand
&>{X*.S)<'8JK$
69'
FullTrust
%.FX1M:
SomeProtectedMethod

[PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")]
public void SomeProtectedMethod () {
§
}
9.
9.
Ki m tra ch ng c c a m t assemblyể ứ ứ ủ ộ
Ki m tra ch ng c c a m t assemblyể ứ ứ ủ ộ



Bạn cần kiểm tra chứng cứ mà bộ thực thi đã gán cho một assembly.


Thu lấy đối tượng
System.Reflection.Assembly
mô tả assembly mà bạn quan
tâm. Lấy tập hợp
System.Security.Policy.Evidence
từ thuộc tính
Evidence
của
đối tượng
Assembly
, rồi truy xuất các đối tượng chứng cứ bên trong bằng phương
thức
GetEnumerator
,
GetHostEnumerator
, hay
GetAssemblyEnumerator
của lớp
Evidence
.
y
Evidence
.4.6$D$::72Jz0
Evidence


Assembly

.D$6$
Evidence
:D$::.&
=S(.&'(.&''$*
768
Evidence
:6$8.4::\::
::(.&'P:: &t.D$::$(.&'
&C&='.SS*(.&'g.S'6'hP::
(.&' .4D$::e'&I$G(.&'G*)=y
Evidence
=&M:<'>D$::&>\

GetEnumerator
526
Chương 13: Bảo mật

GetHostEnumerator

GetAssemblyEnumerator
RM:
GetEnumerator
.
System.Collections.IEnumerator
)e>
D$::&>6$
Evidence
RM:
GetHostEnumerator


GetAssemblyEnumerator
.
IEnumerator
>JD$::Q
6$M:
u2 )  )<'%&'i ::  ::(.&'  .
(.&'  PG  B  58          :  :  x    X  1  M  :
Object.ToString
&)r*D$::"!)eF>9
4G2)'?i::..(.&'@F$*Q
&>  M %  &* W.(  g Microsoft ASP.NET ' Microsoft
Internet Explorer runtime hosthF=B>.:: F*.(.&'
using System;
using System.Reflection;
using System.Collections;
using System.Security.Policy;
public class ViewEvidenceExample {
public static void Main(string[] args) {
// Nạp assembly đã được chỉ định.
Assembly a = Assembly.LoadFrom(args[0]);
// Thu lấy tập hợp Evidence từ assembly đã được nạp.
Evidence e = a.Evidence;
// Hiển thị chứng cứ host.
IEnumerator x = e.GetHostEnumerator();
Console.WriteLine("HOST EVIDENCE COLLECTION:");
while(x.MoveNext()) {
Console.WriteLine(x.Current.ToString());
}
// Hiển thị chứng cứ assembly.
x = e.GetAssemblyEnumerator();

Console.WriteLine("ASSEMBLY EVIDENCE COLLECTION:");
while(x.MoveNext()) {
527
Chương 13: Bảo mật
Console.WriteLine(x.Current.ToString());
}
}
}
7::x)NET Framework&&I8&*4's
iG&=S*tG(.&'H8&*
4>.'*&V(.G>.6$&5
IEnumerator
8I
48M:
MoveNext
@X.*
System.InvalidOperationException

10.
10.
X lý ch ng c khi n p m t assembly ử ứ ứ ạ ộ
X lý ch ng c khi n p m t assembly ử ứ ứ ạ ộ


Bạn cần xử lý chứng cứ khi nạp một assembly để tác động đến các quyền mà bộ
thực thi cấp cho assembly.


Tạo các đối tượng chứng cứ mà bạn muốn gán cho assembly, sau đó thêm chúng
vào một thể hiện của lớp

System.Security.Policy.Evidence
, rồi truyền tập hợp
Evidence
cho phương thức dùng để nạp assembly.
P::g$I.K&C.(.&'hiqi)gidentityh(.&'
;i&=9'(.&'L*(.&'gAssemblyLoaderh
i.2;i::%.(.&'8.
6'gASP.NET'Internet Explorer runtime hosth?F:
:.(.&'"S&*F::*.(.&'I.S
'FNO
ControlEvidence

SecurityPermission


Nếu bạn nạp một assembly vào một miền ứng dụng hai lần nhưng gán chứng cứ
khác vào assembly này mỗi lần như thế, bộ thực thi sẽ ném ngoại lệ
System.IO.FileLoadException
.
PFM:=::*.(.&'"!..
M:' F6.6$
Evidence
.DDE
Evidence
.&:D$::L*!QD$::.&*
.D (.&' .6 $ 
Evidence
   'F  M:*
(.&'HI&*::.;::$&C&*(.&'8
::.@'I::?LZ^z]>M:

G=I'I*.(.&'"#M:.'
>&*t6.6$
Evidence

Bảng 13.2
Các lớp và các phương thức của chúng cho phép bạn gán chứng cứ cho một assembly
Lớp/Phương thức Mô tả
y
System.Activator
PM:'CI.:)

CreateInstance
CreateInstanceFrom
7*  .      .  :  )      Q
(.&'$Ji
528
Chương 13: Bảo mật
y
System.AppDomain
PM:'CI.:)
$.4&CD$
AppDomain
gM:$
0>Fh
CreateInstance
CreateInstanceAndUnwrap
CreateInstanceFrom
CreateInstanceFromAndUnwrap
7*.Q(.&'$Ji
DefineDynamicAssembly

7*  .  D  $ 
System.Reflection.Emit.
AssemblyBuilder
8&*FO)F*
.(.&'&
ExecuteAssembly
H*=.(.&'F.6S$
iqgM:
Main
h
Load
H*(.&'$Ji
y
System.Reflection.Assembly
PM:'CI.:)

Load
LoadFile
LoadFrom
LoadWithPartialName
H*(.&'$Ji
l*.S)<'%&'O)M:
Assembly.Load
*.(.&'
.:)70
Load
8*.S'*.6$
Evidence

O)M:

AddHost
F>.D$::
Site

Zone
g
>4>
System.Security.Policy
h
// Tạo các đối tượng chứng cứ Site và Zone mới.
System.Security.Policy.Site siteEvidence = new
System.Security.Policy.Site("www.microsoft.com");
System.Security.Policy.Zone zoneEvidence = new
System.Security.Policy.Zone(System.Security.SecurityZone.Trusted);
// Tạo một tập hợp Evidence mới.
System.Security.Policy.Evidence evidence =
new System.Security.Policy.Evidence();
// Thêm các đối tượng chứng cứ Site và Zone vào tập hợp Evidence
// bằng phương thức AddHost.
529
Chương 13: Bảo mật
evidence.AddHost(siteEvidence);
evidence.AddHost(zoneEvidence);
// Nạp assembly có tên là "SomeAssembly" và gán các đối tượng Site và
// Zone cho nó. Các đối tượng này sẽ chép đè các đối tượng Site và Zone
// do bộ nạp assembly gán.
System.Reflection.Assembly assembly =
System.Reflection.Assembly.Load("SomeAssembly", evidence);
11.
11.

X lý b o m t b th c thi b ng ch ng c c a mi n ng d ng ử ả ậ ộ ự ằ ứ ứ ủ ề ứ ụ
X lý b o m t b th c thi b ng ch ng c c a mi n ng d ng ử ả ậ ộ ự ằ ứ ứ ủ ề ứ ụ


Bạn cần buộc một giới hạn trên (
upper limit
) lên các quyền đang có hiệu lực với
tất cả các assembly được nạp vào một miền ứng dụng cụ thể.


Cấu hình chính sách bảo mật để cấp các quyền phù hợp dựa trên chứng cứ mà
bạn dự định gán cho miền ứng dụng. Khi tạo miền ứng dụng bằng phương thức
tĩnh
CreateDomain
của lớp
System.AppDomain
, bạn hãy cung cấp một tập hợp
System.Security.Policy.Evidence
chứa các đối tượng chứng cứ của miền ứng
dụng. Sau đó, nạp các assembly mà bạn muốn giới hạn các quyền của chúng bên
trong miền ứng dụng này.
lG&=9'(.&')=>::.(.&''G
*8&=?9'.:))=>::GL
=4::.:)(F(.&'
%4F%::F=7'F8.S*.:)
::N

Bộ thực thi chỉ sử dụng các mức chính sách công ty (
enterprise
), máy (

machine
),
và người dùng (
user
) để tính các quyền của một miền ứng dụng; các chính sách
bảo mật của các miền ứng dụng hiện có không giữ vai trò gì cả. Mục 13.12 sẽ
thảo luận chính sách bảo mật miền ứng dụng.
P.:)4F::DDMI&.6';.S
&=P.:)$::F.z()=>2
&.6F.k90<'>N&.6CAS
w9%=:);'>9.&>.:)8&=*
'I>w.'>N&.6<'>.Š8&'
I.:)$;OBD&E&=z
(I&&.F:9'$'>Nl'q
9'..:)CI.S$*.:
)¢¥è’‘›§8.:)I6.*>>v.S
$*F
"2)90O)::.:)Microsoft Internet Explorer
Internet Explorer*..:).#(.F)Š).$z
9zBQF7.$)Š)Q.(E?
(.&'.G*E*'e.:)wInternet Explorer*.
530
Chương 13: Bảo mật
:).(8F::
System.Security.Policy.Site
.:)
'l'&.58I.$)Š)*.(.&'g'Q
q&h8(.&''&i&&C9'$.
:))=>::
Site

2&.6

Trừ khi bạn gán chứng cứ cho miền ứng dụng một cách tường minh khi tạo nó,
miền ứng dụng này không ảnh hưởng gì đến các yêu cầu bảo mật (
security
demand
).
l::..:)8&*S'*.6$
Evidence
>.D
$::NIF&5M:
Evidence.AddHost
w*.:)
.8&*'6$
Evidence
.>&*tM:
q 
CreateDomain
‘ ꣓‘›œÓ–¥‘²¥Ì–‘˜•µ•‘’¥Å–¥‘À“’¥‘›¥©È–˜‘¹ë‘’±ª‘¨¿‘›¥è’‘›¥•‘ÀۑГ’‘¯¶–¥
z(.:)
‚))<'%&'::..:)7F8:)
*.SQ.&(..:)&(’š‘›¥³L5
.:)::
System.Security.Policy.Publisher
.4&(N
..82)'*Iv.S$*.:)|O)
2&.68&*F.S&(.69'=*M;:
.:6'&*!&(
using System;
using System.Security.Policy;

using System.Security.Cryptography.X509Certificates;
public class AppDomainEvidenceExample {
public static void Main() {

// Tạo một miền ứng dụng mới cho mỗi publisher mà ứng dụng này
// sẽ nạp mã lệnh của nó. Truyền cho phương thức CreateAppDomain
// tên công ty, và tên của file chứa chứng chỉ X.509v3
// của công ty này.
AppDomain appDom1 = CreateAppDomain("Litware", "litware.cer");
AppDomain appDom2 = CreateAppDomain("Fabrikam", "fabrikam.cer");

// Nạp mã lệnh từ các publisher vào miền ứng dụng phù hợp
// để thực thi.
§
}

×