我正在编写一个Java服务器,它必须处理用户使用Jython提供的Python代码。显然,我不能只是在没有破解者访问他/她不应该访问的文件和系统命令的风险的情况下执行它。我一直在寻找某种方法来限制特定线程的文件权限几个小时,而我最接近的是限制整个应用程序的文件权限。是否实现了类似这样的类,或者某种方法来实现它?
答案 0 :(得分: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位于当前用户的HOME目录下)。这将做一些接近您需要的事情,允许对当前用户的HOME下的文件进行读写访问,并禁止访问文件系统的所有其他部分。结果如下(第一个open()引用当前用户的HOME目录下的文件,因为这是当前的工作目录):
>>> 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)
>>>
答案 1 :(得分: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";
(这应该是对接受的答案的评论,但评论不会清晰地格式化。)