2009-04-08 24 views
5

Tôi đang phát triển một hệ thống cho phép các nhà phát triển tải lên các tập lệnh dạng lệnh và trình tạo nhãn hiệu tùy chỉnh.Mã Java/Groovy/Freemarker Sandboxing - Ngăn chặn việc thực thi các phương thức cụ thể

Tôi có thể cung cấp mức bảo mật ở mức rất cao với cơ sở hạ tầng bảo mật Java mặc định - tức là ngăn chặn mã truy cập hệ thống tệp hoặc mạng, tuy nhiên tôi cần hạn chế quyền truy cập vào các phương pháp cụ thể.

Kế hoạch của tôi là sửa đổi các runtimes của Groovy và Freemarker để đọc các chú thích có thể đưa vào danh sách trắng hoặc danh sách đen, tuy nhiên điều này sẽ buộc tôi phải duy trì phiên bản mã của họ.

Tất cả những gì tôi cần làm là ngăn chặn việc thực hiện các phương thức cụ thể khi được gọi từ Groovy hoặc Freemarker. Tôi đã xem xét một hack mà sẽ nhìn vào ngăn xếp cuộc gọi, nhưng điều này sẽ là một hit tốc độ lớn (và nó khá lộn xộn).

Có ai có ý tưởng nào khác để thực hiện việc này không?

Trả lời

5

Bạn có thể làm điều đó bằng cách phân lớp GroovyClassLoader và thực thi các ràng buộc của bạn trong một khách truy cập AST. Bài đăng này giải thích cách thực hiện: http://hamletdarcy.blogspot.com/2009/01/groovy-compile-time-meta-magic.html

Ngoài ra, mã được tham chiếu có trong thư mục mẫu của trình cài đặt Groovy 1.6.

+1

Trong nhiều trường hợp (hầu hết) lớp, phương thức này sẽ không được biết tại thời gian biên dịch, vì vậy việc phân tích dữ liệu AST sẽ không thực sự hiệu quả. Tuy nhiên, đây là câu trả lời hay nhất ở đây vì vậy tôi sẽ đánh dấu câu trả lời này. Tôi đã kết thúc tìm một giải pháp tốt bằng cách sử dụng Metaclasses. –

2

OSGi là điều tuyệt vời cho việc này. Bạn có thể phân đoạn mã của mình thành các gói và đặt chính xác những gì từng gói sẽ hiển thị và các gói khác. bạn có muốn công việc kia?

+0

Điều này có cho phép tôi hạn chế mã gọi các phương thức cụ thể không? –

+0

Khái niệm này giống như gói. Sau đó, bạn có thể hạn chế các phương thức và nội dung bên ngoài gói đó. –

+0

Nói đúng, bạn không thể hạn chế các phương thức nhất định của một lớp được gọi, nhưng bạn có thể tạo một lớp cơ sở và lớp con với nhiều phương thức hơn và chỉ cấp quyền truy cập vào lớp cơ sở hạn chế hơn. –

3

Bạn nên xem dự án groovy-sandbox từ kohsuke. Cũng có một cái nhìn để blog post here của mình về chủ đề này và giải pháp là địa chỉ: sandboxing, nhưng nhược điểm hiệu suất là gì.

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