Tôi là nhà phát triển của động cơ Robocode. Chúng tôi muốn làm cho Robocode đa ngôn ngữ và Scala có vẻ phù hợp. Chúng tôi có plugin Scala prototype here.Bảo mật của thời gian chạy scala
Vấn đề: Bởi vì người dùng là các lập trình viên sáng tạo, họ có thể cố gắng để giành chiến thắng trận chiến cách khác nhau. Các rô bốt cũng được tải xuống từ cơ sở dữ liệu trực tuyến nơi mọi người có thể tải lên một. Vì vậy, khoảng cách về an ninh có thể dẫn đến lỗ hổng bảo mật vào máy tính của người dùng. Các robot được viết bằng Java đang chạy trong sandbox bị hạn chế. Hầu hết mọi thứ đều bị cấm [mạng, GUI, đĩa (giới hạn), chủ đề (giới hạn), trình nạp lớp và phản chiếu]. Hộp cát tương tự như applet trình duyệt. Chúng tôi sử dụng SecurityManager, tùy chỉnh ClassLoader mỗi robot, etc ...
Có hai cách làm thế nào để tổ chức Scala runtime trong Robocode:
1) tải nó cùng với con robot bên trong sandbox. Khá an toàn cho chúng tôi, giải pháp ưu tiên. Nhưng nó sẽ làm hỏng khả năng thời gian chạy của Scala vì thời gian chạy sử dụng sự phản chiếu. Có thể tạo ra các lớp trong thời gian chạy? Sử dụng các chủ đề để làm một số dọn dẹp nội bộ? Truy cập vào JVM/internals? (Tôi không muốn giới hạn khả năng ngôn ngữ)
2) sử dụng thời gian chạy Scala dưới dạng mã đáng tin cậy, bên ngoài hộp, bảo mật trên cùng cấp với JDK. Hiển thị đối với (độc hại) rô bốt. API thời gian chạy Scala có an toàn không? Các phương pháp có bảo vệ an ninh không? Có chế độ an toàn nào không? Có bất kỳ singleton trong thời gian chạy Scala, có thể bị lạm dụng để giao tiếp giữa các robot không? Bất kỳ concurency/threadpool/nhắn tin mà có thể mô phỏng các chủ đề? (Có bất kỳ kiểm tra bảo mật nào cho thời gian chạy của Scala không?)
3) Một số thứ ở giữa, một số loại thời gian chạy trong và một số. Lớp học/gói nào phải hiển thị với rô bốt/đó chỉ là triển khai riêng tư? (Điều này có vẻ là giải pháp trong tương lai)
Câu hỏi đặt ra: Có thể liệt kê và cô lập các bộ phận của thời gian chạy mà phải chạy trong phạm vi tin cậy từ phần còn lại? Các gói và lớp học cụ thể? Hoặc ý tưởng tốt hơn?
Tôi đang tìm câu trả lời cụ thể, điều này sẽ dẫn đến giải pháp an toàn. Suy nghĩ ngẫu nhiên chào đón, nhưng không được trao. Có cuộc thảo luận đang diễn ra tại scala email group. Chưa có câu trả lời cụ thể.
Liên kết tới chuỗi về phản ánh và mảng: http://thread.gmane.org/gmane.comp.lang.scala.internals/2590 –
Một số điểm tốt ở đây. Về mục tiêu di chuyển, u r right, tôi rất vui khi khóa phiên bản scala đơn lẻ. Về "Aha! Tôi sẽ sử dụng sự phản chiếu để giải quyết vấn đề này." đó là hành động tội phạm. Tôi không muốn thấy người dùng/người mới của tôi phàn nàn ở nhóm hỗ trợ của chúng tôi về thời gian chạy bị hỏng mà chúng tôi không sở hữu. Nó không rõ ràng với tôi nếu thời gian chạy ít nhất sẽ quấn/chuyển đổi ngoại lệ cho một cái gì đó phù hợp. Có ít nhất AccessController.doPrivileged() cho các hành động như vậy không? –
Bạn phải xem xét các mục tiêu thị trường Scala. Sự phản chiếu khá phổ biến trong các khung công tác web Java và các ngôn ngữ động dựa trên JVM. Nó khá nhỏ so với thao tác bytecode thời gian chạy, nó cũng khá phổ biến. Cũng xin lưu ý rằng việc sử dụng phản chiếu không nhất thiết bị giới hạn trong thời gian chạy hoặc thư viện, mà là trình biên dịch đơn giản phát ra các cuộc gọi trong mã người dùng thông thường. Tôi không thể tìm thấy một cá thể duy nhất của AccessController trong nguồn Scala, vì vậy tôi không nghĩ rằng đó là tất cả nhận thức được những điều như vậy. –