为什么可以从JS-ScriptEngine eval(String)执行Java代码?

时间:2016-01-01 06:05:12

标签: javascript java

设置像这样的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的重复,因为我想知道为什么这是可能的,而不是如何避免它)

1 个答案:

答案 0 :(得分:2)

您必须停下来思考一下脚本引擎究竟是用于什么的。引用officicial documentation(关于该主题的推荐阅读):

  

使用Java Scripting API,可以编写   Java语言中的可定制/可扩展应用程序并离开   最终用户的自定义脚本语言选择

关键是你用Java编写你的大型旧应用程序,然后有另一方(可能是最终用户,使用你的“引擎/框架”的应用程序开发人员,或者如果你是一个企业级商店的专职顾问)定制它以满足他们的需求。

此自定义以非编译语言(即脚本)进行,如javascript(ECMAScript)。脚本引擎允许交互与Java类完全一样,就像您的小测试脚本所展示的那样。 毕竟,此互动是首先拥有脚本引擎的重点