2012-02-05 32 views
7

Tôi đang bận cố gắng tìm hiểu các công cụ bảo mật trong C# và tôi đang cố gắng để xem Assert hoạt động như thế nào. Tôi đang sử dụng .net 3.5.Xác nhận quyền trong C#

Tôi đã tạo một ứng dụng mẫu để thử tìm hiểu điều này.

phương pháp Calling:

[FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:\")] 
    static void Main(string[] args) 
    { 
     WriteTest testWriter = new WriteTest(); 
     testWriter.Test(); 
     Console.Read(); 
    } 

Trong một thư viện lớp riêng biệt Tôi có:

public class WriteTest 
{ 
    public void Test() 
    { 
     try 
     { 
      FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, @"C:\"); 
      permission.Assert(); 
      using (StreamWriter sw = new StreamWriter(@"C:\test.txt")) 
      { 
       sw.WriteLine("testing!"); 
       sw.Flush(); 
      } 
      Console.WriteLine("Writen to file!"); 
     } 
     catch (SecurityException sec) 
     { 
      Console.WriteLine("No privileges!"); 
     } 
    } 
} 

Mã này thực hiện tốt và tất cả. Nó sẽ ghi vào tập tin. Câu hỏi của tôi chính xác là nó hoạt động như thế nào? Điều này không làm mất hiệu lực các lớp bảo mật nếu tôi chỉ có thể khẳng định các quyền mà tôi muốn để bỏ qua các kiểm tra? Nếu tôi thay đổi Assert thành Demand, nó sẽ đưa ra một ngoại lệ.

Điểm của lớp bảo mật không cho phép tôi đặt quyền để khi tôi gọi một lớp bên thứ ba, tôi có thể ngăn không cho nó bị lừa đảo và làm những thứ tôi không muốn làm? Tôi biết nếu tôi tải dll trong một AppDomain tôi sẽ nhận được hiệu ứng này ngay cả khi bên thứ ba DLL không sử dụng Assert, nó chỉ có vẻ lạ rằng nếu tôi gọi nó trực tiếp nó sẽ làm việc. Tôi đã thử đọc tài liệu MSDN trên Assert nhưng tôi thấy khó hiểu.

+0

Đảm bảo bạn cần hiểu mô hình bảo mật .NET 4 trước ... vì .NET 4.0 Code Access Security đã được đơn giản hóa. –

Trả lời

3

Assert() hữu ích khi ít hơn mã có độ khó cao ("Hội A") gọi nhiều hơn mã có độ khó cao ("Hội B") để thực hiện một số tác vụ. Để thực hiện nhiệm vụ đó, Assembly B cần chạy mã đòi hỏi sự cho phép mạnh mẽ - một sự cho phép mà Assembly A có thể không có. Vì vậy, Assembly B đầu tiên yêu cầu một sự cho phép ít mạnh mẽ hơn (sự cho phép để thực hiện nhiệm vụ ở nơi đầu tiên) và sau đó khẳng định sự cho phép mạnh mẽ hơn để thực sự thực hiện nhiệm vụ.

Ví dụ: giả sử ứng dụng Silverlight một phần tin cậy muốn thực hiện yêu cầu HTTP bằng cách sử dụng lớp System.Net.WebRequest.Việc thiết lập kết nối mạng yêu cầu SocketPermission nhưng đây là quyền cấp thấp, mạnh mẽ không được cấp cho mã không đáng tin cậy từ Internet. Vì vậy, WebRequest yêu cầu quyền ít quyền lực hơn, WebPermission và sau đó xác nhận SocketPermission trước khi tiếp tục thiết lập kết nối mạng.

Bây giờ, trong ví dụ cụ thể của bạn, các Assert() đè Deny vì thư viện lớp đang chạy ở cấp đặc quyền cùng như ứng dụng cả ứng dụng và thư viện lớp có khả năng chạy như Full Trust. Một hội đồng có thể luôn luôn Assert() bất kỳ sự cho phép nào trong bộ cấp phép của nó. Để thực thi Deny trên thư viện lớp, bạn sẽ phải đặt thư viện lớp trong hộp cát.

Lưu ý: Trong .NET 4.0, Deny không được dùng nữa. Từ MSDN Library:

Runtime hỗ trợ đã bị xóa do thực thi các yêu cầu quyền Deny, RequestMinimum, RequestOptional, và RequestRefuse. Nói chung, các yêu cầu này không được hiểu rõ và trình bày tiềm năng về các lỗ hổng bảo mật khi chúng không được sử dụng đúng cách:

  • Hành động từ chối có thể dễ dàng bị ghi đè bởi tác vụ khẳng định. Mã trong một assembly có thể thực hiện một hành động Assert cho một sự cho phép nếu sự cho phép nằm trong bộ cấp quyền cho assembly. Các Assert ngăn chặn từ chối được nhìn thấy trên ngăn xếp, làm cho nó không hiệu quả.
+0

Cảm ơn! Điều này giúp hiểu được tất cả –

1

Phương thức Assert() khiến Mã truy cập bảo mật (CAS) dừng bước trên ngăn xếp theo yêu cầu kiểm tra quyền cụ thể.

Xác nhận là phương thức có thể được gọi trên quyền truy cập mã số lớp và trên lớp PermissionSet. Bạn có thể sử dụng Assert để bật mã của bạn (và người gọi hạ lưu) để thực hiện các hành động mà mã của bạn có quyền thực hiện nhưng người gọi của nó có thể không được phép thực hiện. Xác nhận bảo mật thay đổi quy trình bình thường mà thời gian chạy hoạt động trong khi kiểm tra bảo mật. Khi bạn xác nhận quyền, nó yêu cầu hệ thống bảo mật không kiểm tra người gọi mã của bạn để biết số quyền được xác nhận.

Using the Assert Method

Tôi nghĩ rằng bạn muốn Demand()

Tham Quan:

+0

Tôi hiểu những gì nó làm, tôi chỉ bối rối là tại sao nó làm điều đó. Dường như với tôi như Assert chỉ phủ nhận các quyền mà người gọi đã thiết lập, loại thiết lập nào cho phép thiết lập dường như vô nghĩa đối với tôi. Nếu tôi nhập một số dll bên thứ ba và thiết lập nó để không có quyền ghi (Giống như tôi đã làm ở đây), dll bên thứ ba chỉ có thể sử dụng Assert và được phép ghi? –

+0

@DavidEsteves Việc xác nhận chỉ khả thi đối với các tệp DLL đã có quyền ghi ở cấp hội đồng (ví dụ: chúng nằm trong danh sách các hội đồng đầy đủ sự tin cậy của AppDomain). Trong ngắn hạn, nó có nghĩa là "ghi đè lên cấp phép stack cấp với những người lắp ráp cấp của tôi". – Medinoc

+0

Chúng tôi có enum của SecurityPermissionFlag.Assertion (được sử dụng trong lớp SecurityPermission) có thể được đặt trong người gọi của Appdomain mới. Nó có thể ngăn cản việc lắp ráp của bên thứ ba từ việc khẳng định không? –

Các vấn đề liên quan