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);
}
}
}
添加回答
舉報
