Sự lựa chọn của tôi cho kịch bản hộp cát phía máy chủ là gì? [đóng cửa]


11

Tôi đang xây dựng một trang web công cộng nơi người dùng chia sẻ dữ liệu và tập lệnh để chạy trên một số dữ liệu. Các tập lệnh được chạy trên máy chủ trong một số loại hộp cát mà không có tương tác khác trong chu trình này: chương trình Perl của tôi đọc từ cơ sở dữ liệu một tập lệnh do Người dùng tạo, thêm dữ liệu được xử lý vào tập lệnh (ví dụ: tài liệu JSON) sau đó gọi trình thông dịch, nó trả về phản hồi (tài liệu JSON hoặc văn bản thuần túy), tôi lưu nó vào cơ sở dữ liệu với tập lệnh perl của tôi. Tập lệnh có thể có một số quyền truy cập vào các hàm được xây dựng thêm vào ngôn ngữ kịch bản một mình, nhưng không có gì hơn.

Vì vậy, tôi đã tình cờ phát hiện ra node.js với tư cách là một trình thông dịch javascript và cách đây vài giờ với V8 của Google (v8 có hợp lý với loại điều này không?). CoffeeScript cũng xuất hiện trong đầu tôi, vì nó trông rất đẹp và nó vẫn là Javascript.

Tôi nghĩ rằng javascript đủ phổ biến và nhiều "hộp cát" hơn vì nó không có các cuộc gọi hệ điều hành hoặc bất cứ điều gì không an toàn từ xa (tôi nghĩ).

Nhân tiện, tôi đang viết hệ thống trên Perl và Php cho giao diện người dùng.

Để cải thiện câu hỏi: Tôi đang chọn Javascript vì tôi nghĩ rằng nó đủ an toàn và đơn giản để thực hiện với node.js, nhưng những lựa chọn thay thế nào khác để đạt được loại nhiệm vụ này? Lừa? Con trăn? Tôi chỉ không thể tìm thấy thông tin về cách chạy trình thông dịch hộp cát một cách thích hợp.


Không rõ bạn đang hỏi gì. Có thể không? Chắc chắn, nó có thể.
Robert Harvey

Câu trả lời:


3

Java chứa trình thông dịch JavaScript tích hợp. Nó không phải là mặc định hộp cát, nhưng điều này có thể được kích hoạt bởi:

  • cài đặt màn trập lớp chính xác - JavaScript thường có thể tải các lớp Java. Màn trập lớp là một loại trình quản lý bảo mật quyết định lớp nào có thể được tải và lớp nào không thể.
  • Tập lệnh "khởi động" - khởi tạo JavaScript ngắn để xóa các điểm truy cập vào hệ thống bên ngoài: java = undefined;Packages = undefined;org = undefined;

Nếu bạn làm điều này, các tập lệnh chạy bên trong sẽ không thể truy cập vào môi trường bên ngoài theo bất kỳ cách nào.

Nó cũng cung cấp thời gian chờ tập lệnh và chức năng giới hạn số lượng lệnh hữu ích cho việc tạo hộp cát - bạn có thể giới hạn thời gian hoặc mức độ phức tạp của tập lệnh.

Tôi đã sử dụng cái này trong Java 7 có công cụ Rhino JavaScript. Java 8 có công cụ mới hơn, hiện đại hơn Nashorn - Tôi đã không thử nó với Nashorn nhưng tôi hy vọng nó sẽ tương tự.


Bạn có thể danh sách trắng chứ không phải danh sách đen?
Petah

@Petah, trước tiên bạn có thể vô hiệu hóa (danh sách đen) mọi thứ và sau đó đẩy một số chức năng cụ thể dưới dạng đối tượng vào hộp cát. Điều này về cơ bản là danh sách trắng, vì vậy, bạn có thể làm điều đó.
qbd

Kiến thức JavaScript đủ phổ biến để làm cho nó trở thành một lựa chọn tốt như một ngôn ngữ kịch bản. Bạn có thể muốn xác định một số toàn cầu cũng như các cuộc gọi cho người dùng vì bạn đang hạn chế quyền truy cập vào các cuộc gọi. Hãy nghĩ về cách trình duyệt xác định windowcác biến cho JavaScript để cho phép tương tác.
Michael Storesin

2

suy nghĩ đầu tiên của tôi là node.js - như bạn nghĩ ở trên đó là trình thông dịch javascript. Và đó chính xác là thứ bạn cần, nếu bạn muốn sandbox các script theo cách thực sự an toàn.

Một cách khác có thể là, bạn kiểm tra mọi lệnh trong tập lệnh, nếu nó hợp lệ hay không. Nhưng tôi không nghĩ rằng bạn sẽ có được một hộp cát an toàn.

Lời chào hỏi


Có bất kỳ supbox sandbox i NodeJS hoặc có sẵn với NodeJS?
ysdx

4
Tìm thấy cái này: gf3.github.com/sandbox
ysdx

+1 cho liên kết tuyệt vời đến "NIFTY JAVASCRIPT SANDBOX FOR NODE.JS".
Jack Stone

Lưu ý: hộp cát gf3 có thể bị phá vỡ.
Petah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.