Python 线程的Java文件权限
我正在编写一个Java服务器,它必须处理用户使用Jython给出的Python代码。显然,我不能只是执行它而不冒黑客访问文件和系统命令的风险。几个小时以来,我一直在寻找某种方法来限制特定线程的文件权限,最近的一次是限制整个应用程序的文件权限。是否有一个类实现了这样的功能,或者有什么方法可以实现这样的功能?您可以尝试使用。另请参见关于使用安全管理器为每个线程设置不同的安全设置 您可以像这样设置安全管理器和安全策略:Python 线程的Java文件权限,python,multithreading,permissions,jython,Python,Multithreading,Permissions,Jython,我正在编写一个Java服务器,它必须处理用户使用Jython给出的Python代码。显然,我不能只是执行它而不冒黑客访问文件和系统命令的风险。几个小时以来,我一直在寻找某种方法来限制特定线程的文件权限,最近的一次是限制整个应用程序的文件权限。是否有一个类实现了这样的功能,或者有什么方法可以实现这样的功能?您可以尝试使用。另请参见关于使用安全管理器为每个线程设置不同的安全设置 您可以像这样设置安全管理器和安全策略: jython -Djava.security.manager=securityma
jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile
其中securitymanager是要使用的安全管理器,policyfile包含策略规范,例如所述。如果使用策略文件作为安全策略的源,则以下是一个示例:
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位于当前用户的主目录下)。这将做一些接近您需要的事情,允许对当前用户家中的文件进行读写访问,而不允许访问文件系统的所有其他部分。结果如下(第一个open()引用当前用户主目录下的文件,因为这是当前工作目录):
f1=open('test.txt','r')
>>>f2=打开('/tmp/test.txt',r')
回溯(最里面的最后一个):
文件“”,第1行,是否在中?
java.security.AccessControlException:拒绝访问(java.io.FilePermission/tmp/test.txt读取)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
位于java.security.AccessController.checkPermission(AccessController.java:553)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
位于java.lang.SecurityManager.checkRead(SecurityManager.java:888)
位于java.io.File.exists(File.java:748)
位于org.python.core.PyFile.\u安装程序(未知源)
位于org.python.core.PyFile.file_init(未知源)
位于org.python.core.PyFile$1.new_impl(未知源代码)
位于org.python.core.PyType.invoke\u new\ux(未知源)
在org.python.core.PyType.type\uuuuu调用中(未知源)
在org.python.core.PyType.\u调用\u(未知源)
在org.python.core.PyObject.\u调用\u(未知源)
在org.python.pycode._pyx2.f$0(:1)
在org.python.pycode._pyx2.call_function()上
位于org.python.core.PyTableCode.call(未知源代码)
位于org.python.core.PyCode.call(未知源代码)
位于org.python.core.Py.runCode(未知源代码)
位于org.python.core.Py.exec(未知源代码)
位于org.python.util.PythonInterpreter.exec(未知源代码)
位于org.python.util.InteractiveInterpreter.runcode(未知源代码)
位于org.python.util.InteractiveInterpreter.runsource(未知源)
位于org.python.util.InteractiveInterpreter.runsource(未知源)
位于org.python.util.InteractiveConsole.push(未知源)
位于org.python.util.InteractiveConsole.interact(未知源)
位于org.python.util.jython.main(未知源代码)
java.security.AccessControlException:java.security.AccessControlException:拒绝访问(java.io.FilePermission/tmp/test.txt读取)
>>>
对于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";
(这应该是对已接受答案的注释,只是注释的格式不清晰。)相关(但仍然开放)问题:另外(使用Rhino而不是Jython):inheritablethreadlocal是一个有趣的选项,但您需要小心,因为它不会传播到任何已生成的线程(例如,代码提交到线程池)。因此,这可能是一种脆弱的解决方案。感谢您发布此策略;我认为它不存在于其他任何地方。我在下面的回答中发布了一些其他必要的权限(如果注释允许代码格式化,则正确地添加注释)。
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";