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ủ đề
Trả lời
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)
>>>
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ã). –
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.)
- 1. Vấn đề về quyền đối với Amazon S3 - Cách đặt quyền cho tất cả các tệp cùng một lúc?
- 2. Quyền đối với tệp Nodejs
- 3. Lỗi quyền đối với Java Reflection
- 4. Chủ đề trong các chủ đề trong Java?
- 5. Daemon chủ đề Java
- 6. Mối quan hệ với chủ đề Java
- 7. Tắt phản chiếu Java cho chủ đề hiện tại
- 8. Các vấn đề với chủ đề mờ
- 9. Quyền đối với PHP mkdir()
- 10. Thay đổi quyền đối với tệp Google Drive bằng Javascript
- 11. triển khai rsync và quyền đối với tệp/thư mục
- 12. đồng bộ hóa các chủ đề java
- 13. Chủ đề trong Java
- 14. Chạy tệp Java với tư cách Quản trị viên với đầy đủ các đặc quyền
- 15. java Chủ đề trong libGDX
- 16. Phương pháp Java Chạy trong chủ đề
- 17. Sửa đổi quyền đối với tệp lật đổ
- 18. Java Dừng máy chủ Chủ đề
- 19. Chỉ cập nhật quyền đối với tệp trong git
- 20. Jenkins: Quyền bị từ chối đối với tệp 777
- 21. xuất bản các đối tượng và an toàn chủ đề
- 22. Lọc chủ đề ZeroMQ với Pub/Sub (Java binding)
- 23. Đối với pthread, Làm thế nào để giết chủ đề con từ chủ đề chính
- 24. Các luồng Java: ExecutorService delay giữa các chủ đề
- 25. Các vấn đề với Erlang NIF và chủ đề
- 26. Phương pháp hiện tại chủ đề java
- 27. Cài đặt an toàn cho chủ đề của biến (Java)?
- 28. java chủ đề tầm nhìn
- 29. java swing công nhân chủ đề để chờ cho EDT
- 30. Dấu hiệu quyền đối với tệp là gì và cho là gì?
liên quan (nhưng vẫn mở) câu hỏi: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo
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
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