1

我希望在我正在处理的 Java 项目中使用 Jython。我想知道两件事。

  1. 我可以禁止从 Python 脚本访问 Java 类吗?IE。阻止脚本能够执行以下操作from java.util import Date

  2. 我可以更改print "Hello"等写入的输出流,以便我可以为我的实现重定向脚本输出吗?

还是我必须编辑实际的 Jython 类来禁用和更改它?

4

2 回答 2

0

为了限制对特定 Java 类的访问,您可以实现自定义类加载器并将其注册到 Jython:

this.pyInterpreter.getSystemState().setClassLoader(this.userCodeClassLoader);

如果您因为安全问题而这样做(不允许在运行用户代码的服务器上执行某些操作),您必须注意 Jython 还提供了不会被您的类加载器捕获的内置函数实现:

内置 Python 函数实现

于 2013-04-20T14:39:15.927 回答
0

另一种方法是分析 Python 解析树中的所有导入。我认为最好有不止一种安全措施:

   String code = "import sys\n"+"from java.io import File\n"+"sys.exit()";
   AnalyzingParser anPar = new  AnalyzingParser(new ANTLRStringStream(code), "", "ascii");

   mod tree=anPar.parseModule();
   Visitor vis = new Visitor() {
       @Override
       public Object visitImport(Import node) throws Exception {
          System.out.println(node);
                       return node;
       }

       @Override
       public Object visitImportFrom(ImportFrom node) throws Exception {
          System.out.println(node);
                       return node;
       }
         };
   List<PythonTree> children=tree.getChildren();
   for (PythonTree c : children){
         vis.visit(c);
   }
于 2013-06-05T06:00:40.543 回答