Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 线程的Java文件权限_Python_Multithreading_Permissions_Jython - Fatal编程技术网

Python 线程的Java文件权限

Python 线程的Java文件权限,python,multithreading,permissions,jython,Python,Multithreading,Permissions,Jython,我正在编写一个Java服务器,它必须处理用户使用Jython给出的Python代码。显然,我不能只是执行它而不冒黑客访问文件和系统命令的风险。几个小时以来,我一直在寻找某种方法来限制特定线程的文件权限,最近的一次是限制整个应用程序的文件权限。是否有一个类实现了这样的功能,或者有什么方法可以实现这样的功能?您可以尝试使用。另请参见关于使用安全管理器为每个线程设置不同的安全设置 您可以像这样设置安全管理器和安全策略: jython -Djava.security.manager=securityma

我正在编写一个Java服务器,它必须处理用户使用Jython给出的Python代码。显然,我不能只是执行它而不冒黑客访问文件和系统命令的风险。几个小时以来,我一直在寻找某种方法来限制特定线程的文件权限,最近的一次是限制整个应用程序的文件权限。是否有一个类实现了这样的功能,或者有什么方法可以实现这样的功能?

您可以尝试使用。另请参见关于使用安全管理器为每个线程设置不同的安全设置

您可以像这样设置安全管理器和安全策略:

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