2 回答
TA贡献1712条经验 获得超3个赞
是的,你可以,正如@Daniel Baranowski 上面建议的那样。
不,你绝对不应该。
运行客户提交的任何代码都会使您面临极大的风险。
它可以访问您的文件系统吗?那你就麻烦了。
它可以执行网络调用吗?那你也有麻烦了。
即使您阻止了这些选项,您是否检查此用户代码是否及时终止?
TA贡献1851条经验 获得超5个赞
这当然是可能的,但它会使您面临巨大的安全风险。
没有什么能阻止您直接从 String 运行 JavaScript 代码。将其保存在文件中不是必需的。您可以获取发送到您的服务器的 POST 的正文,并像这样执行它:
package example;
import jdk.nashorn.api.scripting.JSObject;
import jdk.nashorn.api.scripting.NashornScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Example {
private final ThreadLocal<NashornScriptEngine> engineHolder;
public Example() {
// You don't need to run code from files. The code can be a string which was posted to your server.
String jsCodeToRun = "function helloWorld(name) { return { value: 'Hello' + name } }"
this.engineHolder = ThreadLocal.withInitial(() -> {
NashornScriptEngine nashornScriptEngine = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn");
try {
nashornScriptEngine.eval(jsCodeToRun);
} catch (ScriptException e) {
throw new RuntimeException(e);
}
return nashornScriptEngine;
});
}
public JSObject runTheCode(String name) {
try {
JSObject result = (JSObject) engineHolder.get().invokeFunction("helloWorld", name);
// The result will be an object returned by our helloWorld function.
return result;
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}
添加回答
举报