设置像这样的JavaScript-ScriptEngine:
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Compute {
public static void main(String[] args){
try{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
System.out.println(engine.eval(args[0]));
}
catch(Exception e){
System.out.println("Syntax Error!");
}
}
}
为什么你可以这样做: java Compute " java.util.Arrays.toString(new java.io.File(\"。\")。listFiles())"
不是ScriptEngine for#34; JavaScript"应该只执行JS?
关于引擎实际执行的内容或为何可能实现此目标的任何链接,将不胜感激。
(编辑:这不是security problem with Java ScriptEngine的重复,因为我想知道为什么这是可能的,而不是如何避免它)
答案 0 :(得分:2)
您必须停下来思考一下脚本引擎究竟是用于什么的。引用officicial documentation(关于该主题的推荐阅读):
使用Java Scripting API,可以编写 Java语言中的可定制/可扩展应用程序并离开 最终用户的自定义脚本语言选择
关键是你用Java编写你的大型旧应用程序,然后有另一方(可能是最终用户,使用你的“引擎/框架”的应用程序开发人员,或者如果你是一个企业级商店的专职顾问)定制它以满足他们的需求。
此自定义以非编译语言(即脚本)进行,如javascript(ECMAScript)。脚本引擎允许交互与Java类完全一样,就像您的小测试脚本所展示的那样。 毕竟,此互动是首先拥有脚本引擎的重点。