2009-08-28 25 views
16

Tôi đang sử dụng javax.scripting để thêm hỗ trợ chạy JavaScripts tùy ý do người dùng tải lên ở phía máy chủ. Rõ ràng là tôi muốn bảo mật những tập lệnh đó!Làm cách nào để bảo mật các tập lệnh chạy bằng javax.scripting?

Tê giác, riêng của nó, có khuôn khổ để bảo mật tập lệnh khi chạy. Tuy nhiên, tài liệu cho javax.scripting không đề cập đến bảo mật, quyền hoặc hạn chế các lớp có sẵn cho tập lệnh. Vậy đây có phải là một lỗ hổng lớn trong API javax.scripting mà nó không cung cấp một khuôn khổ để bảo đảm các tập lệnh mà nó thực thi không?

Tôi không muốn sử dụng Rhino trực tiếp vì ban đầu tôi đã thử điều đó nhưng có một số vấn đề khi hiển thị các phiên bản Java cho tập lệnh đang chạy. Khung làm việc javax.scripting làm cho nó (sử dụng Rhino dưới mui xe) đã tạo ra các tập lệnh chạy tầm thường và đơn giản này trong một máy chủ đa luồng.

Tôi muốn danh sách trắng các lớp Java có thể được truy cập/khởi tạo trong tập lệnh đang chạy. Bất cứ ai có thể chỉ cho tôi một ví dụ hoặc tài liệu về cách để đạt được điều này?

Trả lời

18

Nó chỉ ra rằng javax.scripting không cung cấp một khung bảo mật. Sau khi tìm kiếm, tôi tìm thấy một tài liệu trong bộ nhớ cache của Google đề xuất cố gắng sử dụng khuôn khổ doPrivilegedAction của Java nhưng sau một số thử nghiệm, tôi không thể thực hiện điều này để ngăn các tập lệnh mở ổ cắm hoặc truy cập hệ thống tệp.

Sau khi tôi hỏi câu hỏi này, tôi phát hiện ra nó đã được yêu cầu ở đây trên StackOverflow: How can you run Javascript using Rhino for Java in a sandbox? Trên trang đó, nó cho biết rằng Rhino được bao gồm trong JDK6 đã bảo mật. Như tôi đã nói, tôi có thể mở ổ cắm và các hành động có hại khác từ kịch bản.

Cuối cùng, tôi đã bỏ rơi javax.scripting và Rhino được nhúng trực tiếp. Bằng cách xây dựng một phong tục ContextFactory đó cũng là một ClassShutter tôi đã có thể đạt được hai kết quả một cách dễ dàng:

  1. Hạn chế thời gian thực hiện kịch bản cho một thời hạn tối đa
  2. Hạn chế truy cập lớp để những người tôi đã trắng niêm yết, đó là về cơ bản là java.lang.* và một vài lớp được chọn trong hệ thống phân cấp của máy chủ của tôi.

CodeUtopia (mà tôi không thể liên kết đến bởi vì, như một người dùng mới, tôi không được phép liên kết đến nhiều trang trong một bài duy nhất, nhưng nó được liên kết trong bài StackOverflow khác) là có giá trị trong việc mô tả kiến trúc ClassShutter và trang API ContextFactory của Rhino mô tả cách xây dựng một tùy chỉnh ContextFactory.

2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ mô tả cách để tê giác sandbox và javax.scripting sử dụng Rhino làm công cụ tập lệnh JS để bạn có thể sử dụng ở trên, mặc dù tên gói có thể khác nhau.

Tôi đã làm việc trên ứng dụng Java có số cần Rhino để tạo tập lệnh. Ứng dụng sẽ cần phải chạy JavaScript mã không đáng tin cậy từ bên thứ ba, vì vậy tôi phải tìm cách chặn quyền truy cập vào tất cả các phương thức Java , ngoại trừ các phương pháp tôi muốn. Điều này sẽ không thành vấn đề nếu có là một cách dễ dàng để tắt LiveConnect - tính năng của Rhino cung cấp quyền truy cập java vào tập lệnh - nhưng có không có điều gì như vậy.

Tuy nhiên, sau khi đào rất nhiều xung quanh, cuối cùng tôi đã tìm thấy cách để làm điều này mà không có quá nhiều hack. Trong thực tế , có thể thực hiện bằng cách mở rộng một vài trong số các lớp Rhino và sử dụng các bộ định sẵn được cung cấp để ghi đè một số số của các giá trị mặc định.

0

FYI, điều này hiện có thể thực hiện trong Java 8 mới của javax.scripting sử dụng công cụ mới được gọi là Nashorn. Xem Secure Nashorn JS Execution

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