2012-03-27 42 views
6

Chúng tôi cần phải "bảo vệ" một lớp học khỏi các phương pháp tĩnh vì mục đích bảo mật. Chúng tôi không muốn newbie devs sau đề xuất của các công cụ mã hóa để làm cho một thành viên tĩnh như chúng ta cần phải sử dụng một constructor với một mật khẩu để kiểm soát truy cập vào lớp này.Yêu cầu một lớp học được thể hiện trong C#?

Có cách nào để bảo vệ lớp .NET trong C# để ngăn không cho nó có bất kỳ thành viên tĩnh nào không?

Tính năng như vậy, nếu không có, có đáng giá đối với phiên bản .NET tương lai không?

Cảm ơn bạn.

+10

Điều này dường như yêu cầu các công cụ của bạn chịu trách nhiệm cho người dùng. Tại sao không chỉ đào tạo các nhà phát triển về cách sử dụng API một cách thích hợp? – rossipedia

+2

Tôi thực sự muốn nghe lý do để loại bỏ các phương pháp tĩnh. Bạn có thể chia sẻ không? –

+10

Newbie devs vs. devs tạo các hàm tạo với mật khẩu để hạn chế instantiation/inheritance? wow, và không có nó không phải là một tính năng đáng giá – meandmycode

Trả lời

8

Bạn có thể sử dụng StyleCop để thực thi quy tắc tùy chỉnh. Nó sẽ phải được thực hiện như một hành động xây dựng, mặc dù. Bạn có thể sử dụng FxCop để phân tích các tệp nhị phân.

3

Bạn có thể chạy kiểm tra bằng cách sử dụng phản chiếu tại thời gian chạy, nhưng ngoài ra, không có tính năng ngôn ngữ ngăn thành viên tĩnh.

Tôi có thể nghĩ không sử dụng tốt cho một tính năng như vậy. Đây là một vấn đề của truyền thông hơn là một trong những thực hiện.

Trong trường hợp của bạn, bạn có thể đặt chức năng được bảo vệ trong lớp cơ sở trừu tượng và chạy kiểm tra xem người dùng có được phép trước khi thực hiện bất kỳ chức năng được bảo vệ nào không.

+0

Việc thêm một hàm tạo tĩnh để kiểm tra sự hiện diện của các phương thức tĩnh là dễ viết. – CodesInChaos

0

Tôi nghĩ rằng một lớp kín sẽ đủ, mặc dù các thành viên tĩnh được phép trong khai báo lớp gốc. Tôi nghĩ rằng các lớp học có nguồn gốc sẽ không cho phép các thành viên tĩnh hơn nữa.

9

Điều dễ nhất cần làm là thiết lập FxCop trên máy chủ xây dựng của bạn và viết quy tắc FxCop tùy chỉnh để kiểm tra các thành viên tĩnh.

This question có chi tiết về cách viết quy tắc FxCop tùy chỉnh.


Ngoài ra, như SimpleCoder chỉ ra, bạn có thể sử dụng StyleCop để thực thi các quy tắc trên mã nguồn.

This page mô tả cách thiết lập StyleCop với msbuild.

0

Tôi phải thừa nhận rằng tôi chưa bao giờ nghe nói về một chương trình bảo mật như vậy. Tôi nghĩ có lý do chính đáng tại sao tôi không nghe về nó - bạn có chắc chắn nó bảo vệ như bạn muốn không?

Bằng cách yêu cầu hàm tạo chứa mật khẩu, bạn đang cố gắng tự bảo vệ mình khỏi những người sử dụng lớp học của bạn. Nhưng những người đó có thể dịch ngược và biên dịch lại lớp học của bạn để xóa kiểm tra mật khẩu - vì vậy bạn được bảo vệ chống lại điều gì?

29

chúng tôi cần sử dụng hàm tạo với mật khẩu để kiểm soát quyền truy cập vào lớp này.

Điều này nghe có vẻ như một ý tưởng tồi tệ, nhưng tất nhiên tôi không biết gì về vấn đề bảo mật bạn đang cố giải quyết. Đây là câu hỏi thú vị hơn nhiều so với câu hỏi của bạn: Mối đe dọa bạn đang cố gắng bảo vệ là gì? Có thể là cách tốt hơn để làm điều đó.

Có cách nào để bảo vệ lớp .NET trong C# để ngăn không cho nó có bất kỳ thành viên tĩnh nào không?

Các nhà phát triển cấp cao xem xét các kiểm tra của các nhà phát triển cơ sở. Bạn nên làm gì, nhưng đặc biệt là nếu lớp học có một số ngữ nghĩa bảo mật.

Tính năng này, nếu không có, sẽ đáng giá cho phiên bản .NET sau này?

Điều này khó xảy ra.

Cảm ơn bạn.

Bạn được chào đón!

+3

Lấy trộm suy nghĩ ngay từ đầu tôi. – StriplingWarrior

+5

+5 cho 'Bạn được chào đón!' –

+2

@SimpleCoder: Mẹ tôi đã dạy tôi nói rằng khi ai đó cảm ơn tôi. –

0

Gợi ý

  1. Đào tạo
  2. More Đào tạo
  3. Mã Nhận xét
  4. Khác gợi ý StyleCop hoặc FxCop - cả hai lựa chọn tốt
  5. Nếu # 4 thất bại - hơn đào tạo - Thời gian này tie nó để đánh giá hiệu suất. :)
0

Tôi khá đồng ý với Eric Lippert. Nhưng trong những trường hợp đó tôi muốn làm một cái gì đó như thế này (đôi khi chỉ để ngăn bản thân mình mắc lỗi) Tôi cố gắng viết một bài kiểm tra đơn vị cho nó. Như thế này:

[Test] 
public void Class_should_not_have_static_methods() 
{ 
    var staticMethods = typeof (Foo).GetMethods().Where(x => x.IsStatic); 

    Assert.That(staticMethods.Count(), Is.EqualTo(0), "Static methods: " + string.Join(", ", staticMethods.Select(x => x.Name))); 
} 
Các vấn đề liên quan