2008-12-09 25 views
5

Có ai có thể giải thích ý nghĩa và mục đích của các giá trị cho sự kiện SecurityAction không?Hiểu tham số "SecurityAction" của .NET cho các quyền

Trang MSDN không rõ ràng lắm. Nó cho biết LinkDemand xảy ra khi biên dịch trong thời gian ngắn trong khi Demand xảy ra khi chạy.

Tại sao nên phân biệt và trong trường hợp nào tôi sẽ sử dụng LinkDemand như trái ngược với Nhu cầu?

Tương tự như vậy, các trường hợp sử dụng của các giá trị thú vị khác như InheritenceDemand, Assert và PermitOnly là gì.

Trả lời

18

LinkDemand về cơ bản yêu cầu mã gọi để có quyền được chỉ định. Nhu cầu, mặt khác, không chỉ yêu cầu mã gọi để có quyền được chỉ định, mà còn cả mã gọi là mã gọi điện và mã gọi là, và cứ thế, tất cả các con đường lên ngăn xếp (hoặc cho đến khi Xác nhận được tìm thấy, xem bên dưới).

LinkDemand có thể được thực thi tại thời gian biên dịch JIT, bởi vì nếu trình biên dịch JIT truy cập một câu lệnh gọi phương thức với LinkDemand, nó có thể xác định ngay lập tức nếu mã gọi có quyền hay không. Nhu cầu phải được thực thi trong thời gian chạy mỗi lần thực hiện một cuộc gọi đến phương thức này, bởi vì không thể thực hiện được thời gian biên dịch để biết những gì sẽ có trên stack trong bất kỳ cuộc gọi nào. Như vậy, LinkDemand hiệu quả hơn nhiều. Tuy nhiên, sự cân bằng cho hiệu quả đó là ít an ninh hơn. Với LinkDemand, bạn tin tưởng rằng mã gọi sẽ không cho phép mã gọi ITS (có thể hoặc không được phép) sử dụng nó cho các mục đích bất chính. (Nói cách khác, bạn tin tưởng rằng không có lỗ hổng bảo mật nào trong mã gọi mà người gọi của nó có thể khai thác để truy cập gián tiếp vào phương thức với LinkDemand.) Với Demand, bạn biết rằng mọi người trong ngăn xếp hoàn toàn có quyền (tại ít nhất là cho đến khi một Assert được tìm thấy), vì vậy không có rủi ro từ những người gọi không tin cậy.

Khẳng định về cơ bản là ngắn mạch cho nhu cầu. Việc kiểm tra bảo mật xảy ra với Demand dừng lại nếu một người gọi trên stack có một Assert hoạt động (nói cách khác, chỉ những người gọi trong stack đến Assert mới phải có sự cho phép). Vì vậy, giống như LinkDemand, bạn phải tin rằng mã với Assert không thể bị khai thác bởi người gọi của nó.

Từ chối cũng là một mạch ngắn cho nhu cầu, nhưng thay vì khẳng định quyền, nó sẽ hủy bỏ quyền mà người gọi có thể có. Bạn sẽ sử dụng điều này để giúp ngăn chặn các lỗ hổng bảo mật có thể xảy ra bằng cách đảm bảo rằng không có quyền truy cập không liên quan nào có hiệu lực trong suốt cuộc gọi có thể bị khai thác.

PermitOnly giống như Deny, ngoại trừ thay vì từ chối một quyền cụ thể, nó từ chối mọi quyền EXCEPT được chỉ định.

InheritanceDemand, không giống như những người khác, không liên quan trực tiếp đến các cuộc gọi phương thức, nhưng nói rằng một lớp không có quyền không thể kế thừa từ lớp với InheritanceDemand. Điều này có thể được sử dụng, ví dụ, để ngăn chặn mã không đáng tin cậy từ được truy cập vào các thành viên được bảo vệ của lớp mà nếu không sẽ được truy cập vào các lớp con cháu.

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