2010-10-18 27 views
7

Tôi vừa đọc về điều này article về Bảo mật Truy cập Mã. Nó có như vậy một ví dụ trong đó:Mã bảo mật truy cập là một trò đùa?

using System.Security.Permissions; 
public class MyFileAccessor 
{ 
    public MyFileAccessor(String path, bool readOnly) 
    { 
    path = MakeFullPath(path); // helper fcn 
    FileIOPermissionAccess desiredAccess = readOnly 
     ? FileIOPermissionAccess.Read 
     : FileIOPermissionAccess.AllAccess; 
    FileIOPermission p = new FileIOPermission(desiredAccess, path); 
    p.Demand(); 
    // 
    ••• 
    open the file 
    } 
    // ••• 
} 

gì nếu tôi không sử dụng FileIOPermissionAccess loại và không bao giờ includ mã như p.Demand() trong mã của tôi ở tất cả? Nói cách khác, nếu tôi muốn làm điều gì đó tồi tệ, tại sao tôi nên xin phép điều đó? Không phải là một trò đùa sao? HOẶC tôi có hiểu sai không?

Trả lời

7

Vâng, vâng, ví dụ là một trò đùa, bạn sẽ không bao giờ tự viết một cái gì đó như thế này. Điều còn thiếu là phần thực sự quan trọng, mã mà // mở tệp. Một phiên bản thực tế của nó sẽ, nói, pinvoke CreateFile().

Vấn đề là Windows không biết gì về CAS.Vì vậy, nếu bạn cung cấp một chức năng tiện ích như thế này và bạn muốn thực thi các quy tắc CAS thì bạn phải xác minh rằng mã gọi gọi của bạn có quyền cần thiết. Tất nhiên, loại mã này thực sự chỉ thuộc về .NET framework. Có một cái nhìn xem tại FileStream.Init() và lưu ý FileIOPermission được yêu cầu có trước khi cuộc gọi CreateFile.

+0

Cảm ơn bạn đã trả lời rõ ràng của bạn. Vì vậy, vấn đề là - để ngăn chặn * lạm dụng * mã của tôi, tôi nên bao gồm mã CAS nhất định trong thành phần/hàm của tôi để thực thi các quy tắc CAS. – smwikipedia

+0

. Không chắc chắn từ "lạm dụng" là thích hợp, nếu bạn cung cấp một cách để mã bỏ qua việc kiểm tra CAS bình thường được xây dựng trong khuôn khổ thì, vâng, bạn phải tự chịu trách nhiệm thực thi nó. –

4

Quyền truy cập tệp (ví dụ: sử dụng FileStream) sẽ tự động yêu cầu FileIOPermission. Và điều này là như vậy đối với tất cả các lớp tiêu chuẩn, khi họ thực hiện một số hành động yêu cầu sự cho phép, họ sẽ yêu cầu nó tự động. Xem dưới .NET Framework Security here. Vì vậy, mã mẫu là vô ích, không ai rõ ràng sẽ yêu cầu quyền truy cập tệp. Nó là hợp lý nếu bạn phát triển một số API và mã của bạn được ký kết để không ai có thể thay đổi nó.

Đọc thêm, đây là trích dẫn từ bài viết rằng:

Bây giờ trong thế giới thực, bạn sẽ không viết các lớp học như MyFileAccessor để truy cập tập tin. Thay vào đó, bạn sẽ sử dụng các lớp được hệ thống cung cấp như System.IO.FileStream, đã được thiết kế để thực hiện các kiểm tra bảo mật thích hợp cho bạn. Chúng thường được thực hiện trong hàm tạo với tất cả các hiệu ứng và các tác động bảo mật mà tôi đã thảo luận trước đó.

+0

Cảm ơn bạn đã trả lời. Nếu tôi đang làm một lớp học mới thì sao? Điều đó có nghĩa là để thực hiện công việc CAS, phải có một số ** hợp tác/thỏa thuận ** giữa nhà phát triển ** trung thực ** và cơ sở hạ tầng CAS? Tôi lấy nó như là hoàn toàn * vô ích * như xa như an ninh là có liên quan. – smwikipedia

+0

Hoặc chúng ta có nên luôn sử dụng thành phần phần mềm được viết bởi ** các nhà phát triển ** trung thực không? – smwikipedia

+0

@smwikipedia No: "Tất cả các lớp .NET Framework thực hiện các hoạt động bị hạn chế và truy cập các tài nguyên bị hạn chế như hệ thống tệp, các yêu cầu quyền cho bạn. Do đó, khi bạn sử dụng các lớp .NET Framework, bạn không được sao chép các yêu cầu quyền. " http://support.microsoft.com/kb/315529 trường hợp khi bạn yêu cầu quyền rõ ràng là mơ hồ đối với tôi. Tôi không biết gì hữu ích cả. – Andrey

3

Bên trong API java.io, bạn có thể đảm bảo rằng séc đang được thực hiện. Nếu bạn muốn kiểm soát quyền truy cập (bỏ qua một sự cố trước khi nó xảy ra), bạn phải thực hiện các kiểm tra thích hợp PRIOR cho các kiểm tra nội bộ được thực hiện bởi các cuộc gọi API.

Mã Java thường chạy trên các máy tính bạn kiểm soát, nhưng nó cũng thường chạy trên các máy tính bạn không kiểm soát. Hãy suy nghĩ về các applet Java. Họ nên yêu cầu quyền truy cập vào hệ thống tệp vì tác giả của chương trình không được phép truy cập không được kiểm soát vào hệ thống tệp của người khác.

Nếu bạn cần phải ngăn chặn một nhóm người làm điều gì đó độc hại, thì bạn cần phải ngăn chặn mọi người có thể làm điều gì đó độc hại để bảo mật là có thật. Nếu không, những người bị bệnh sẽ chỉ nói rằng họ là một phần của nhóm không được kiểm soát đáng tin cậy.

Dòng lệnh Java có thể chạy theo mặc định với quyền cho phép bạn chạm vào hệ thống tệp của riêng bạn. Giả định là nếu bạn khởi chạy chương trình cục bộ, bạn có thể đã làm rối tung các phần của hệ thống tệp mà bạn đã truy cập. Applet khởi chạy với tất cả các quyền mặc định này đã bị xóa. Bằng cách đó, người duyệt trang web nơi applet cư trú phải tự cấp quyền cho một chương trình từ xa (applet) để chạm vào hệ thống tệp của họ.

Bạn thấy đây là bằng chứng cho thấy không có cửa sau đặc biệt nào bỏ qua bảo mật cho một số người dùng (hoặc trong một số điều kiện).

+0

Xin lỗi, đã trả lời nó cho Java, nhưng .Net tương tự như vậy mà câu trả lời vẫn giữ. –

+0

No. Câu hỏi là gì nếu tôi không gọi là 'Yêu cầu', vì vậy nó rất cụ thể và bạn nói với lý thuyết nổi tiếng – Andrey

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