2009-04-21 36 views
18

Tôi cần gọi một số mã Java bán đáng tin cậy và muốn vô hiệu khả năng sử dụng phản chiếu trong suốt thời gian thực thi mã đó.Tắt phản chiếu Java cho chủ đề hiện tại

try{ 
    // disable reflection somehow 
    someObject.method(); 
} 
finally{ 
    // enable reflection again 
} 

Điều này có thể được thực hiện với Quản lý bảo mật không và nếu có thì làm cách nào?

Làm rõ/Bối cảnh: Đây là phần tiếp theo để another question giới hạn các gói có thể được gọi từ JavaScript/Rhino. Câu trả lời được chấp nhận tham chiếu đến một mục blog về cách thực hiện điều đó và nó đòi hỏi hai bước, cái đầu tiên sử dụng API Rhino (ClassShutter), thứ hai tắt tính năng phản chiếu và Class.forName(). Tôi đã nghĩ rằng tôi có thể thực hiện bước thứ hai đó một cách rõ ràng hơn bằng cách sử dụng SecurityManager (tìm hiểu về SecurityManager, như đã được chỉ ra, là một con thú phức tạp, trên đường đi).

Để tổng hợp, tôi muốn (từ mã, không đặt tệp) để tắt Class.forName() và mọi quyền truy cập vào toàn bộ gói phản chiếu.

+0

im không chắc chắn về cách SecurityManager hoạt động, nhưng hãy kiểm tra câu hỏi này: [http : //stackoverflow.com/questions/762459/how-to-disable-java-security-manager] (http://stackoverflow.com/questions/762459/how-to-disable-java-security-manager) –

Trả lời

17

Tùy thuộc vào những gì bạn đang cố hạn chế.

Nói chung, API có thể truy cập công cộng không bị hạn chế. Tuy nhiên, miễn là bạn không cấp mã không đáng tin cậy cho phép ReflectPermission("suppressAccessChecks"), nó sẽ không thể truy cập vào API không công khai trong gói khác.

Nếu bạn có danh sách các gói bạn muốn hạn chế quyền truy cập, có hai bước. Đầu tiên, trong các thuộc tính Security, include the restricted package in the package.access list. Sau đó, hãy cung cấp tin cậyRuntimePermission("accessClassInPackage." + pkg) của bạn.

Cách phổ biến để phân biệt mã không đáng tin cậy của bạn là tải mã từ một vị trí khác và tham khảo các mã khác nhau trong tệp chính sách của bạn khi cấp quyền.

Kiến trúc bảo mật Java rất mạnh, nhưng tôi biết nó cũng phức tạp; nếu bạn muốn có một ví dụ cụ thể hơn, vui lòng mô tả chính xác những cuộc gọi bạn muốn hạn chế và tôi sẽ cố gắng rõ ràng hơn.


Để làm những gì bạn muốn mà không sửa đổi các tập tin java.policy và/hoặc các tập tin java.security sẽ rất khó khăn, có lẽ không thể. java.security.Policy đại diện cho thông tin trong java.policy nhưng không cung cấp quyền truy cập ghi. Bạn có thể tạo triển khai Policy của riêng mình và cài đặt nó trong thời gian chạy miễn là mọi hiện tại SecurityManager cho phép nó.

Mặt khác, bạn có thể chỉ định tệp java.policy tùy chỉnh làm tùy chọn dòng lệnh. Nếu bạn đang cung cấp một ứng dụng hoàn chỉnh với một số loại trình chạy, điều đó có thể dễ dàng hoàn thành. Nó cũng cung cấp một số minh bạch cho người dùng của bạn. Người dùng tinh vi có thể xem lại các quyền mà bạn muốn cấp cho ứng dụng.

+0

I thêm một số bối cảnh cho câu hỏi. – Thilo

4

Vâng, bạn có thể ghi đè SecurityManager.checkMemberAccess và đưa ra định nghĩa chặt chẽ hơn. Tuy nhiên, nó không thực sự hoạt động như thế. Điều gì xảy ra chẳng hạn nếu mã định nghĩa một finaliser?

Làm rõ: Các API khác sử dụng phản ánh và các API khác. Ví dụ: java.beans, LiveConnect và Rhino. Một đối thủ có thể từ trong một kịch bản, nói, tạo ra một bối cảnh tê giác mới mà không có màn trập và do đó khởi động vào JRE đầy đủ. Với một hệ thống mở, một danh sách đen không bao giờ có thể được hoàn thành.

Tóm lại: để sử dụng mô hình bảo mật Java bạn cần phải làm việc với nó, không phải chống lại nó.

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