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

Tài liệu Bảo mật phần 3 ppt

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 (194.45 KB, 9 trang )

1.1
Hạn chế ai đó thừa kế các lớp của bạn
và chép đè các thành viên lớp
V
V


Bạn cần kiểm soát những ai có thể thừa kế các lớp của bạn thông qua sự thừa
kế (inheritance) và một lớp dẫn xuất có thể chép đè những thành viên nào.
#
#


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ệ.
Các modifier như sealed, public, private, và virtual cho phép bạn kiểm soát khả năng của
các lớp khác khi các lớp này thừa kế lớp của bạn và chép đè các thành viên của nó. Tuy
nhiên, các modifier này không linh hoạt, không có khả năng chọn lọc khi giới hạn những
mã lệnh nào có thể thừa kế một lớp hoặc chép đè các thành viên c
ủa nó. Ví dụ, bạn muốn
chỉ những mã lệnh do công ty hay khoa của bạn viết thì mới có thể thừa kế các lớp
nghiệp vụ quan trọng, hoặc chỉ những mã lệnh được nạp từ máy cục bộ thì mới có thể
thừa kế các phương thức nào đó. Bằng cách áp dụng InheritanceDemand vào khai báo
lớp hay thành viên, bạn có thể chỉ định các quyền (lúc thực thi) mà một lớp phải có thì
mới có thể th
ừa kế lớp của bạn hoặc chép đè các thành viên cụ thể nào đó. Nhớ rằng, các
quyền của một lớp là các quyền của assembly mà lớp này được khai báo trong đó.
Mặc dù bạn có thể yêu cầu bất kỳ quyền hay tập quyền nào trong InheritanceDemand,
nhưng thông thường là yêu cầu các quyền định danh (identity permission). Quyền định
danh mô tả chứng cứ (evidence) do một assembly đưa cho bộ thực thi. Nếu một assembly


đưa ra các kiểu chứng cứ nào đó lúc nạp, bộ thực thi sẽ tự động gán cho assembly này
quyền định danh phù hợp. Quyền định danh cho phép bạn sử dụng các lệnh bảo mật bắt
buộc và khai báo (imperative và declarative security statement) để trực tiếp ra các quyết
định bảo mật (security decision) căn cứ trên định danh mã (code identity) mà không cần
trực tiếp đánh giá các đối tượng chứng cứ. Bả
ng 13-1 liệt kê kiểu quyền định danh được
tạo cho mỗi kiểu chứng cứ (kiểu chứng cứ là thành viên của không gian tên
System.Security.Policy, kiểu quyền định danh là thành viên của không gian tên
System.Security.Permissions).

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 Không
Hash Không
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.
Bạn phải sử dụng cú pháp bảo mật khai báo (declarative security syntax) để hiện thực
một InheritanceDemand, nên bạn phải sử dụng bản sao đặc tính (attribute counterpart)
của lớp quyền mà bạn muốn yêu cầu. Tất cả các lớp quyền đề
u có một bản sao đặc tính
để tạo các lệnh bảo mật khai báo—bao gồm InheritanceDemand. Ví dụ, bản sao đặc tính
của PublisherIdentityPermission là PublisherIdentityPermissionAttribute, và bản sao đặc

tính của StrongNameIdentityPermission là StrongNameIdentityPermissionAttribute—tất
cả các quyền và các bản sao đặc tính của chúng cùng theo quy ước đặt tên và là các thành
viên của cùng không gian tên.
Để kiểm soát những mã lệnh nào có thể thừa kế lớp của bạn, hãy áp dụng
InheritanceDemand khi khai báo lớp. Đoạn mã dưới đây trình bày một lớp được bảo vệ

bằng InheritanceDemand. Theo đó, chỉ những lớp bên trong các assembly được ký bởi
publisher-certificate (nằm trong file pubcert.cer) thì mới có thể thừa kế lớp
InheritanceDemandExample. Nội dung của file pubcert.cer được đọc lúc biên dịch, và
các thông tin chứng thực cần thiết được gắn vào assembly.
[PublisherIdentityPermission(SecurityAction.InheritanceDemand,
CertFile = @"I:\CSharp\Chuong13\pubcert.cer")]
public class InheritanceDemandExample {
§
}
Để kiểm soát những mã lệnh nào có thể chép đè các thành viên nào đó, bạn hãy áp dụng
InheritanceDemand khi khai báo thành viên. Xét đoạn mã dưới đây, chỉ những lớp được
cấp tập quyền FullTrust thì mới có thể chép đè phương thức SomeProtectedMethod.
[PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")]
public void SomeProtectedMethod () {
§
}
1.2
Kiểm tra chứng cứ của một assembly
V
V


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.
Lớp Evidence mô tả một tập hợp các đối tượng chứng cứ. Thuộc tính chỉ-đọc Evidence
của lớp Assembly trả về một đối tượng tập hợp Evidence chứa t
ất cả các đối tượng chứng
cứ mà bộ thực thi đã gán cho assembly khi assembly này được nạp.
Thật ra, lớp Evidence chứa hai tập hợp, mô tả hai kiểu chứng cứ khác nhau: chứng cứ
host và chứng cứ assembly. Chứng cứ host bao gồm các đối tượng chứng cứ được gán
cho assembly bởi bộ thực thi hay mã lệnh đã nạp assembly (mã lệnh này là đáng tin cậy).
Chứng cứ assembly mô tả các đối tượng ch
ứng cứ tùy biến được nhúng vào assembly lúc
tạo dựng. Lớp Evidence hiện thực ba phương thức sau đây để liệt kê các đối tượng chứng
cứ bên trong:


GetEnumerator


GetHostEnumerator


GetAssemblyEnumerator
Phương thức GetEnumerator trả về một System.Collections.IEnumerator dùng để liệt kê
tất cả các đối tượng chứng cứ bên trong tập hợp Evidence. Phương thức

GetHostEnumerator và GetAssemblyEnumerator trả về một thể hiện IEnumerator liệt kê
chỉ các đối tượng chứng cứ từ tập hợp tương ứng.
Ví dụ dưới đây trình bày cách hiển thị chứng cứ host và chứng cứ assembly của một
assembly. Chú ý rằng, t
ất cả các lớp chứng cứ chuẩn đều chép đè phương thức
Object.ToString để biểu diễn trạng thái của đối tượng chứng cứ. Mặc dù có liên quan
nhưng không phải lúc nào ví dụ này cũng hiển thị chứng cứ mà một assembly sẽ có khi
được nạp từ bên trong chương trình của bạn. Runtime host (như Microsoft ASP.NET hay
Microsoft Internet Explorer runtime host) có thể tự ý gán thêm chứng cứ host khi nó nạp
một assembly.
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()) {
Console.WriteLine(x.Current.ToString());
}
}
}
Tất cả các lớp chứng cứ chuẩn do .NET Framework cấp đều bất biến, bạn không thể thay
đổi các giá trị của chúng sau khi bộ thực thi đã tạo ra rồi gán chúng cho assembly. Ngoài
ra, bạn không thể thêm hay loại bỏ các item trong lúc đang liệt kê một tập hợp bằng
IEnumerator, nếu không, phương thức MoveNext sẽ ném ngoại lệ
System.InvalidOperationException.
1.3
Xử lý chứng cứ khi nạp một assembly
V
V


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.
Chứng cứ (được chiếm hữu bởi một assembly) định nghĩa định danh (identity) của

assembly và xác định bộ thực thi cấp các quyền nào cho assembly. Bộ nạp assembly
(Assembly Loader) chịu trách nhiệm chính trong việc xác định gán chứng cứ
gì cho một
assembly, nhưng một host đáng tin cậy (như ASP.NET hay Internet Explorer runtime
host) cũng có thể gán chứng cứ cho một assembly. Mã lệnh của bạn có thể gán chứng cứ
khi nạp một assembly nếu mã lệnh này có phần tử ControlEvidence của
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.
Có nhiều phương thức thực hiện việc gán chứng cứ khi nạp một assembly. Một đặc điểm
mà tất cả các phương thức này thường có là nhận một tập hợp Evidence làm đối số—lớp
Evidence là mộ
t bộ chứa cho các đối tượng chứng cứ. Bạn phải đặt từng đối tượng chứng
cứ mà bạn muốn gán cho assembly vào một tập hợp Evidence và truyền nó cho phương
thức nạp assembly. Nếu bạn gán chứng cứ mới xung đột với chứng cứ được gán bởi bộ
nạp assembly, chứng cứ mới sẽ thay thế chứng cứ cũ. Bảng 13-2 liệt kê các lớp và các
phương th
ức của chúng trực tiếp hay gián tiếp nạp một assembly. Mỗi phương thức cung
cấp một hay nhiều phiên bản nạp chồng chấp nhận một tập hợp 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ả
Lớp System.Activator
Các phương thức này ảnh hưởng đến miền ứng
dụng hiện hành.
CreateInstance
CreateInstanceFrom

Tạo một kiểu trong miền ứng dụng hiện hành từ
assembly được chỉ định.
Lớp System.AppDomain
Các phương thức này ảnh hưởng đến miền ứng
dụng được mô tả bởi đối tượng AppDomain
(phương thức được gọi trên đó).
CreateInstance
CreateInstanceAndUnwrap
CreateInstanceFrom
CreateInstanceFromAndUnwrap
Tạo một kiểu từ assembly được chỉ định.
DefineDynamicAssembly
Tạo một đối tượng System.Reflection.Emit.
AssemblyBuilder, bạn có thể sử dụng nó để tạo
động một assembly trong bộ nhớ.
ExecuteAssembly
Nạp và thực thi một assembly có điểm nhập đã
được định nghĩa (phương thức Main).
Load Nạp assembly được chỉ định.
Lớp System.Reflection.Assembly
Các phương thức này ảnh hưởng đến miền ứng
dụng hiện hành.

×