2011-11-10 13 views
11

मैं जावा सर्वर प्रोग्रामिंग कर रहा हूं जिसे उपयोगकर्ता द्वारा जेथॉन का उपयोग करके पाइथन कोड को संभालना है। जाहिर है, मैं फ़ाइलों और सिस्टम कमांड तक पहुंचने वाले क्रैकर के कुछ जोखिम के बिना इसे निष्पादित नहीं कर सकता हूं जिसे वह नहीं करना चाहिए। मैं अब कुछ घंटों के लिए विशिष्ट थ्रेड के लिए फ़ाइल अनुमतियों को प्रतिबंधित करने के लिए कुछ रास्ता खोज रहा हूं, और मैंने जो निकटतम प्राप्त किया है, वह पूरे एप्लिकेशन के लिए फ़ाइल अनुमतियों को प्रतिबंधित कर रहा है। क्या कोई वर्ग लागू किया गया है जो ऐसा कुछ करता है, या ऐसा करने के लिए कुछ तरीका है?धागे के लिए जावा फ़ाइल अनुमतियां

+2

संबंधित (लेकिन अभी भी खुला) प्रश्न: http://stackoverflow.com/questions/6744553/java -सुरिटी-मैनेजर-प्रति-थ्रेड – Thilo

+1

इसके अलावा (ज्योथन के बजाय राइनो के साथ): http: // stackoverfl ow.com/questions/93911/how-can-you-run-javascript-using-rhino-for-java-in-a-sandbox – Thilo

+0

विरासत योग्य थ्रेडलोकल एक दिलचस्प विकल्प है, लेकिन आपको सावधान रहना होगा, क्योंकि यह ' किसी भी पहले से तैयार धागे (उदाहरण के लिए प्रचारित किया जा सकता है थ्रेड पूल में जमा कोड)। तो, यह शायद एक नाजुक समाधान की तरह है। – jtahlborn

उत्तर

4

आप java.lang.SecurityManager का उपयोग करने का प्रयास कर सकते हैं। प्रति थ्रेड अलग-अलग सुरक्षा सेटिंग्स सेट करने के लिए सुरक्षा प्रबंधक का उपयोग करने के बारे में this question भी देखें।

आप इस प्रकार का सुरक्षा प्रबंधक और सुरक्षा नीति निर्धारित कर सकते हैं:

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

जहां securitymanager उपयोग करने के लिए सुरक्षा प्रबंधक और policyfile के रूप में उदाहरण के here के लिए वर्णित नीति विशिष्ट विवरण है है। आप सुरक्षा नीति के लिए स्रोत के रूप में एक नीति फ़ाइल का उपयोग करते हैं, यहाँ एक उदाहरण है:

grant { 
    permission java.security.AllPermission; 
} 

Jython कुछ अनुमतियों की आवश्यकता होगी सहित शुरू करने के लिए निम्नलिखित:

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

(यह आपका cachedir मान लिया गया है वर्तमान उपयोगकर्ता की होम निर्देशिका के तहत है)। यह आपको उस उपयोगकर्ता के होम के तहत फ़ाइलों को पढ़ने और लिखने की अनुमति देने और फाइल सिस्टम के अन्य सभी हिस्सों तक पहुंच को अस्वीकार करने की आवश्यकता के करीब कुछ करेगा।

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

इस नीति को पोस्ट करने के लिए धन्यवाद; मुझे नहीं लगता कि यह कहीं और मौजूद है। मैंने नीचे दिए गए उत्तर में कुछ अन्य आवश्यक अनुमतियां पोस्ट की हैं (अगर टिप्पणियां कोड स्वरूपण की अनुमति देती हैं तो सही टिप्पणी।)। –

0

Jython 2.5.2 के साथ मैंने पाया इन आवश्यक अनुमतियाँ:

यहाँ (के बाद से इस वर्तमान कार्यशील निर्देशिका है वर्तमान उपयोगकर्ता के घर निर्देशिका के अंतर्गत एक फाइल करने के लिए संदर्भित करता है पहले खुले()) नतीजा है
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"; 

(सिवाय इसके कि एक टिप्पणी स्पष्ट रूप से स्वरूपित नहीं होगा यह स्वीकार किए जाते हैं जवाब देने के लिए एक टिप्पणी होना चाहिए।)

संबंधित मुद्दे