2010-10-20 32 views
31

Snoop cho phép bạn nhìn vào bên trong ứng dụng và thay đổi các thuộc tính phần tử. Đó là một tài sản tuyệt vời cho các nhà phát triển, nhưng có thể là vấn đề bảo mật trong một số trường hợp, như khi chúng tôi có người dùng muốn tìm kiếm những nơi họ không nên tìm kiếm. Có cách nào để làm một cái gì đó để chặn các ứng dụng như Snoop từ "snooping" ứng dụng của bạn?Cách Snoop chứng minh ứng dụng wpf của bạn?

Và nếu không có cách nào chặn nó, bạn nên làm gì để giảm thiểu rủi ro bảo mật?

Snoop là một tiện ích cho phép bạn duyệt qua cây trực quan của ứng dụng wpf và xem và thay đổi các thuộc tính. Nó rất hữu ích khi bạn đang cố gắng để gỡ lỗi một cái gì đó và không có ý tưởng những gì đang xảy ra. Bạn có thể tìm thấy thêm here.

Cảm ơn bạn.

+0

Câu hỏi hay tự hỏi bản thân mình –

+1

Bạn có thể cung cấp thêm thông tin về chương trình "Snoop" này hay đăng liên kết tới thông tin trên đó không? –

Trả lời

30

Bằng cách triển khai bảo mật đúng cách. Nếu "bảo mật" của bạn có thể bị cản trở với một công cụ như Snoop, thì bạn đang làm sai.

Giả sử có lệnh mà chỉ một số người dùng nhất định có thể thực thi. Có vẻ như là nơi duy nhất bạn thực thi điều này là ở cấp độ giao diện người dùng (bằng cách vô hiệu hóa nút tương ứng, chẳng hạn). Trong trường hợp đó, bạn nói đúng - tôi có thể dễ dàng sử dụng Snoop để kích hoạt nút và thực thi lệnh. Nhưng bạn nên thực thi các ràng buộc bảo mật trên máy chủ của bạn, hoặc có lẽ trong logic thực thi lệnh của bạn nếu bạn không có máy chủ. Về cơ bản, bảo mật nên được thực hiện gần với điều bạn đang cố gắng bảo vệ nhất có thể. Bảo mật ở cấp độ giao diện người dùng chỉ đơn thuần là để thuận tiện cho người dùng.

+0

Kent, cảm ơn bạn đã trả lời. Tôi đồng ý với bạn, không nên thực hiện bảo mật ở cấp độ giao diện người dùng. Trong dự án của tôi, chúng tôi sử dụng lệnh và chúng tôi có logic trong CanExecute sẽ vô hiệu hóa các nút cho người dùng nhất định (và họ không thể được kích hoạt lại bằng cách sử dụng snoop), cũng như các biện pháp bảo vệ máy chủ ngăn người dùng có thể thực hiện những việc nhất định. Tuy nhiên, chúng tôi có các ứng dụng khác không sử dụng các lệnh và nút chỉ bị ẩn, vì vậy chúng có thể dễ dàng bị "giật". – chiefanov

39

Có thực sự là một cách để phát hiện xem ứng dụng của bạn đang được "snooped" bởi chương trình snoop hay không. Giải pháp mà tôi đưa ra không phải là một viên đạn bạc, và nếu ai đó thực sự muốn sử dụng ứng dụng của bạn, họ sẽ phải sửa đổi mã nguồn snoop (đó là một dự án nguồn mở).

Snoop thực sự thực hiện là nó đưa một assembly vào ứng dụng của bạn, và assembly lắp ráp đệ quy kiểm tra các cây ứng dụng trực quan của bạn bắt đầu từ gốc. Nói cách khác, snoop thực sự chạy bên trong ứng dụng của bạn. Điều đó đang được nói, giải pháp là để nâng cao một sự kiện khi lắp ráp snoop được tiêm vào ứng dụng của bạn.

Trước tiên, bạn cần phải đăng ký sự kiện lắp ráp tải ở đâu đó trong ứng dụng của bạn (tốt hơn là begginging):

AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad); 

Sau đó, bạn sẽ thực hiện xử lý hơi như thế này:

 void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args) 
    { 
     if (args.LoadedAssembly.FullName.StartsWith("ManagedInjector")) 
      MessageBox.Show("hey you, stop snooping");//and shut down your application. 
    } 

Bạn có thể cần phải tăng cường giải pháp này cho giải pháp bạc đạn thực, nhưng ít nhất giải pháp này chắc chắn sẽ dừng phiên bản mới nhất của snoop đang chạy như (không có mã sửa đổi). Giải pháp tốt hơn là kiểm tra xem không có assembly bên ngoài nào được đưa vào ứng dụng của bạn hay không.

Tuy nhiên, Kent vẫn đúng trong thực tế là một tiện ích như Snoop không được gây ra bất kỳ lỗ hổng bảo mật nào vì bảo mật không được triển khai ở cấp UI. Nhưng ít nhất điều này cho bạn thấy làm thế nào để ngăn chặn mọi người từ "snooping" ứng dụng của bạn.

+3

Điều này thật tuyệt. Và kết hợp với câu trả lời của Kent chính xác những gì tôi đang tìm kiếm. – chiefanov

+2

Cả hai đều là những câu trả lời tuyệt vời, cảm ơn các bạn rất nhiều –

+0

có, câu trả lời này hoàn thành giải pháp. – ahmedsafan86

0

phản ứng tuyệt vời cho một câu hỏi rất tốt,

Tôi muốn thêm một ví dụ về mật khẩu mà không bao giờ nên được lưu trong DataContext của bạn, như séc snoop cũng là DataContext của giao diện người dùng, vì vậy nếu bạn sử dụng quyền kiểm soát PasswordBox bạn sẽ thấy rằng bạn không thể ràng buộc thuộc tính mật khẩu, điều đó có nghĩa là ngay cả khi bạn sử dụng ứng dụng mà bạn không thể nhận được mật khẩu vì nó không được lưu trong bất kỳ thuộc tính nào

Nhưng chúng tôi đã tìm thấy nhiều người cố gắng tạo một công việc xung quanh (người trợ giúp, hành vi, người dùng kiểm soát ...) để liên kết mật khẩu, nhưng họ quên rằng thông tin có thể nhận được như vậy

Vì vậy, máy chủ của bạn sẽ không bao giờ tin tưởng khách hàng của bạn, mỗi khi cần kiểm tra đặc quyền (vì chúng tôi có thể đánh lừa yêu cầu của khách hàng bằng Fiddler cho exp sau đó xây dựng lại yêu cầu theo yêu cầu để bảo mật ứng dụng khách)

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