Tôi đang tìm cách chạy một số tập lệnh chưa được xác minh (được viết bằng ngôn ngữ chưa được xác định, nhưng cần phải dựa trên Java, vì vậy JRuby, Groovy, Jython, BeanShell, vv là tất cả các ứng cử viên). Tôi muốn các kịch bản này có thể thực hiện một số việc và hạn chế làm những việc khác.Bảo mật bằng Java Scripting (JRuby, Jython, Groovy, BeanShell, v.v ..)
Thông thường, tôi chỉ sử dụng SecurityManager của Java và được thực hiện với nó. Điều đó khá đơn giản và cho phép tôi hạn chế quyền truy cập vào tệp và mạng, khả năng tắt JVM, v.v. Và điều đó sẽ làm việc tốt cho những thứ cấp cao mà tôi muốn chặn.
Nhưng có một số nội dung tôi muốn cho phép, nhưng chỉ qua API/thư viện tùy chỉnh mà tôi đã cung cấp. Ví dụ, tôi không muốn cho phép truy cập mạng trực tiếp để mở một URLConnection đến yahoo.com, nhưng tôi OK nếu nó được thực hiện với MyURLConnection. Đó là - có một tập hợp các phương thức/lớp mà tôi muốn cho phép và sau đó mọi thứ khác tôi muốn được giới hạn.
Tôi không tin rằng loại bảo mật này có thể được thực hiện với mô hình bảo mật Java chuẩn, nhưng có lẽ nó có thể. Tôi không có yêu cầu cụ thể về hiệu suất hoặc tính linh hoạt trong chính ngôn ngữ kịch bản lệnh (các tập lệnh sẽ là các lệnh gọi thủ tục đơn giản tới API của tôi với vòng lặp/phân nhánh cơ bản). Vì vậy, ngay cả một "lớn" trên đầu mà kiểm tra một kiểm tra an ninh trên mỗi cuộc gọi phản ánh là tốt của tôi.
Đề xuất?
Cảm ơn - điều đó thực sự hữu ích. Btw - trường hợp sử dụng cho tôi là cho phép mọi người tải lên tập lệnh cho các bài kiểm tra tải của họ để chạy trên http://browsermob.com. Tôi đã không nhìn vào Rhino, nhưng có vẻ như nó có thể hoạt động miễn là nó không cho phép truy cập trực tiếp vào các API Java như Groovy. –
Vâng - bạn có nhiều quyền kiểm soát ở đó, điều này tốt từ quan điểm bảo mật. Bạn có thể phải tạo trình bao bọc cho một số API nhất định và sau đó hiển thị các đối tượng đó. Ví dụ, chúng ta có một công cụ dòng công việc, và tạo ra một đối tượng dòng công việc mà sau đó chúng ta tiếp xúc với JavaScript, điều khiển những gì bạn có thể làm. –
Theo dõi nhanh: làm cách nào bạn đảm bảo rằng biến Gói không thể truy cập? Xem http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –