2011-11-10 22 views
11

Tôi đang lập trình một máy chủ Java có xử lý mã Python do người dùng sử dụng bằng Jython. Rõ ràng, tôi không thể chỉ thực hiện nó mà không có một số nguy cơ của một cracker truy cập các tập tin và lệnh hệ thống mà anh/cô ấy không nên. Tôi đã được tìm kiếm một số cách để hạn chế quyền truy cập tập tin cho các chủ đề cụ thể cho giờ bây giờ, và gần nhất tôi đã nhận được hạn chế quyền truy cập tập tin cho toàn bộ ứng dụng. Có một lớp thực hiện mà làm một cái gì đó như thế này, hoặc một số phương pháp để làm điều đó?Quyền đối với tệp Java cho các chủ đề

+2

liên quan (nhưng vẫn mở) câu hỏi: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo

+1

Ngoài ra (với Rhino thay vì Jython): http: // stackoverfl ow.com/questions/93911/how-can-you-run-javascript-using-rhino-for-java-in-a-sandbox – Thilo

+0

inheritablethreadlocal là một tùy chọn thú vị, nhưng bạn cần phải cẩn thận, bởi vì nó đã thắng ' t được tuyên truyền cho bất kỳ chủ đề đã sinh ra (ví dụ mã được gửi đến một nhóm luồng). vì vậy, nó có thể là một giải pháp dễ vỡ. – jtahlborn

Trả lời

4

Bạn có thể thử sử dụng java.lang.SecurityManager. Xem thêm this question về cách sử dụng trình quản lý bảo mật để đặt các cài đặt bảo mật khác nhau cho mỗi chuỗi.

Bạn có thể đặt một trình quản lý an ninh và chính sách bảo mật như thế này:

jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile 

nơi SecurityManager là người quản lý an ninh sử dụng và policyfile chứa đặc tả chính sách như mô tả ví dụ here. Nếu bạn sử dụng một tập tin chính sách như là nguồn cho chính sách an ninh, đây là một ví dụ:

grant { 
    permission java.security.AllPermission; 
} 

Jython sẽ cần một số điều khoản để khởi động bao gồm:

grant { 
    permission java.io.FilePermission "${user.home}${/}-", "read, write"; 
    permission java.lang.RuntimePermission "createClassLoader"; 
    permission java.lang.RuntimePermission "getProtectionDomain"; 
}; 

(điều này giả định cachedir của bạn nằm trong thư mục HOME của người dùng hiện tại). Điều này sẽ làm một cái gì đó gần với những gì bạn cần cho phép đọc và ghi truy cập vào các tập tin theo HOME của người dùng hiện tại và không cho phép truy cập vào tất cả các phần khác của hệ thống tập tin. Dưới đây là kết quả (mở đầu tiên() dùng để chỉ một tập tin dưới thư mục HOME của người dùng hiện nay vì đây là thư mục hiện làm việc):

>>> f1=open('test.txt', 'r') 
>>> f2=open('/tmp/test.txt', 'r') 
Traceback (innermost last): 
    File "<console>", line 1, in ? 
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) 
    at java.security.AccessController.checkPermission(AccessController.java:553) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888) 
    at java.io.File.exists(File.java:748) 
    at org.python.core.PyFile._setup(Unknown Source) 
    at org.python.core.PyFile.file_init(Unknown Source) 
    at org.python.core.PyFile$1.new_impl(Unknown Source) 
    at org.python.core.PyType.invoke_new_(Unknown Source) 
    at org.python.core.PyType.type___call__(Unknown Source) 
    at org.python.core.PyType.__call__(Unknown Source) 
    at org.python.core.PyObject.__call__(Unknown Source) 
    at org.python.pycode._pyx2.f$0(<console>:1) 
    at org.python.pycode._pyx2.call_function(<console>) 
    at org.python.core.PyTableCode.call(Unknown Source) 
    at org.python.core.PyCode.call(Unknown Source) 
    at org.python.core.Py.runCode(Unknown Source) 
    at org.python.core.Py.exec(Unknown Source) 
    at org.python.util.PythonInterpreter.exec(Unknown Source) 
    at org.python.util.InteractiveInterpreter.runcode(Unknown Source) 
    at org.python.util.InteractiveInterpreter.runsource(Unknown Source) 
    at org.python.util.InteractiveInterpreter.runsource(Unknown Source) 
    at org.python.util.InteractiveConsole.push(Unknown Source) 
    at org.python.util.InteractiveConsole.interact(Unknown Source) 
    at org.python.util.jython.main(Unknown Source) 

java.security.AccessControlException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read) 
>>> 
+0

Cảm ơn bạn đã đăng chính sách này; Tôi không nghĩ nó tồn tại ở đâu khác. Tôi đã đăng một số quyền cần thiết khác trong câu trả lời bên dưới (đúng một nhận xét nếu nhận xét cho phép định dạng mã). –

0

Với Jython 2.5.2 Tôi tìm thấy những điều khoản cần thiết:

permission java.io.FilePermission "${user.dir}${/}path${/}to${/}python${/}-", "read"; 
permission java.util.PropertyPermission "user.dir", "read"; 
permission java.lang.RuntimePermission "accessDeclaredMembers"; 
permission java.lang.RuntimePermission "createClassLoader"; 
permission java.lang.RuntimePermission "getProtectionDomain"; 

(Đây phải là một bình luận cho câu trả lời được chấp nhận, ngoại trừ một bình luận sẽ không định dạng dễ đọc.)

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