2011-11-10 23 views
11

Jython kullanan kullanıcı tarafından verilen Python kodunu işlemek zorunda olan bir Java sunucusu programlıyorum. Açıkçası, bir korsanın dosyalara ve sistem komutlarına erişmesi gerekmediği için bir risk olmadan bunu gerçekleştiremem. Belirli iş parçacıkları için saatlerce dosya izinlerini kısıtlamak için bir yol aradım ve en yakınım tüm uygulama için dosya izinlerini kısıtlıyordu. Böyle bir şey yapan bir sınıf var mı, yoksa bunu yapmak için bir yöntem var mı?İş parçacıkları için Java dosya izinleri

+2

İlgili (ama yine de açık) sorusu: http://stackoverflow.com/questions/6744553/java -security-manager-thread başına – Thilo

+1

Ayrıca (Jython yerine Rhino ile): http: // stackoverfl ow.com/questions/93911/how-can-you-run-javascript-using-rhino-for-java-in-a-sandbox – Thilo

+0

inheritablethreadlocal ilginç bir seçenektir, ancak dikkatli olmalısınız, çünkü 'kazandı önceden oluşturulmuş ipliklere (örn. Bir iş parçacığı havuzuna gönderilen kod). Yani, muhtemelen kırılgan bir çözümdür. – jtahlborn

cevap

4

java.lang.SecurityManager kullanmayı deneyebilirsiniz. Ayrıca, iş parçacığı başına farklı güvenlik ayarları belirlemek için bir güvenlik yöneticisi kullanmakla ilgili olarak this question konusuna bakın.

Böyle bir güvenlik yöneticisi ve güvenlik politikasını ayarlayabilirsiniz:

SecurityManager güvenlik kullanmaya yöneticisi ve örnek here için açıklandığı şekilde politika belirlemeyi ihtiva eden Policyfile olan
jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile 

. Eğer güvenlik politikası için kaynak olarak bir ilke dosyası kullanırsanız, burada bir örnek:

grant { 
    permission java.security.AllPermission; 
} 
Jython dahil başlatmak için bazı izinler gerekir

aşağıdadır:

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

(bu cacheDir varsayar geçerli kullanıcının HOME dizininin altındadır). Bu, mevcut kullanıcının HOME'u altındaki dosyalara okuma ve yazma erişimine ve dosya sisteminin tüm diğer bölümlerine erişimi engellemeye izin vermeniz gerekenlere yakın bir şey yapacaktır. Jython 2.5.2 ile

>>> 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

Bu politikayı gönderdiğiniz için teşekkür ederiz; Başka bir yerde var olduğunu sanmıyorum. Aşağıda bir cevapta diğer gerekli izinleri yayınladım (yorumların kod biçimlendirmesine izin veriliyse haklı olarak bir yorum). –

0

buldum gerekli bu izinlerin:

(bu geçerli çalışma dizini olması nedeniyle ilk açık() geçerli kullanıcının ANA dizin altında bir dosyayı ifade eder) İşte sonuçtur

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"; 
(a comment okunaklı biçimlendirmek olmayacak dışında bu, kabul cevaba bir açıklama olmalıdır.)

İlgili konular