2 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
是的,你可以,正如@Daniel Baranowski 上面建議的那樣。
不,你絕對(duì)不應(yīng)該。
運(yùn)行客戶提交的任何代碼都會(huì)使您面臨極大的風(fēng)險(xiǎn)。
它可以訪問(wèn)您的文件系統(tǒng)嗎?那你就麻煩了。
它可以執(zhí)行網(wǎng)絡(luò)調(diào)用嗎?那你也有麻煩了。
即使您阻止了這些選項(xiàng),您是否檢查此用戶代碼是否及時(shí)終止?

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
這當(dāng)然是可能的,但它會(huì)使您面臨巨大的安全風(fēng)險(xiǎn)。
沒(méi)有什么能阻止您直接從 String 運(yùn)行 JavaScript 代碼。將其保存在文件中不是必需的。您可以獲取發(fā)送到您的服務(wù)器的 POST 的正文,并像這樣執(zhí)行它:
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);
}
}
}
添加回答
舉報(bào)