Javascript 如何运行用户输入Ace编辑器的代码

Javascript 如何运行用户输入Ace编辑器的代码,javascript,ace-editor,Javascript,Ace Editor,我在一个项目中使用Ace编辑器,我想知道如何运行用户输入到编辑器中的代码。我想我可以用这样的东西: var editor=ace.edit(“编辑器”); 编辑:setTheme(“ace/theme/chaos”); setMode(“ace/mode/javascript”); 函数runProgram(){ var code=editor.getValue(); var display=document.getElementById(“display”); 试一试{ var结果=评估(代码

我在一个项目中使用Ace编辑器,我想知道如何运行用户输入到编辑器中的代码。我想我可以用这样的东西:

var editor=ace.edit(“编辑器”);
编辑:setTheme(“ace/theme/chaos”);
setMode(“ace/mode/javascript”);
函数runProgram(){
var code=editor.getValue();
var display=document.getElementById(“display”);
试一试{
var结果=评估(代码);
display.innerHTML=结果;
}捕获(e){
警报(“错误”+e);
}
}

但出于安全考虑,我不确定是否使用
eval()
。我希望找到一些安全执行和显示用户代码的方法。请注意,我是javascript的初学者。

如果您在同一用户上运行用户编写的代码,则计算机安全性不受关注,因为用户可以在浏览器控制台中运行相同的代码

但是,如果希望防止用户意外破坏编辑器,可以使用带有沙盒属性和适当CORS策略的iframe。如果从不同的域加载iframe,它将在chrome中的不同进程中运行,无限循环不会阻止编辑器

这将是一个玩具实现

iframe=document.body.appendChild(document.createElement(“iframe”))
iframe.sandbox=“allow modals allow forms allow pointer lock allow popup allow home origin allow scripts”
iframe.src=“data:text/html,”+encodeURIComponent(`
函数运行程序(e){
控制台日志(e)
var代码=e.data;
var display=document.body;
试一试{
var结果=评估(代码);
display.innerHTML=结果;
}捕获(e){
警报(“错误”+e);
}
}
window.onmessage=runProgram
等待…`)
然后,当用户按下run按钮时,使用postMessage

iframe.contentWindow.postMessage(editor.getValue(), "*")

一个真正的实现要复杂得多,例如,一个流行的开源项目就是这样做的。

您应该使用后端语言在POST请求中发送此代码,并使用其函数在后端语言中执行,然后返回执行响应。这就是它的工作原理。这样做也更安全。谢谢,我会试试。谢谢,这真的很有帮助。