我希望在我正在处理的 Java 项目中使用 Jython。我想知道两件事。
我可以禁止从 Python 脚本访问 Java 类吗?IE。阻止脚本能够执行以下操作
from java.util import Date
?我可以更改
print "Hello"
等写入的输出流,以便我可以为我的实现重定向脚本输出吗?
还是我必须编辑实际的 Jython 类来禁用和更改它?
为了限制对特定 Java 类的访问,您可以实现自定义类加载器并将其注册到 Jython:
this.pyInterpreter.getSystemState().setClassLoader(this.userCodeClassLoader);
如果您因为安全问题而这样做(不允许在运行用户代码的服务器上执行某些操作),您必须注意 Jython 还提供了不会被您的类加载器捕获的内置函数实现:
另一种方法是分析 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);
}