我需要构建一个允许用户输入 javascript 代码的 Web 应用程序,然后动态执行代码并以某种方式在同一页面上显示结果。流程将是这样的:
在网页中,有一系列的textarea,在每一个textareas的下面,都有一个result div元素(或者随便什么元素span,p,都无所谓)。用户将在文本区域内输入 javascript 代码。他应该能够输入他想要的任何 javascript 代码,但最后他会调用一个自定义函数,例如 my_application_output(some_variables_computed_from_previous_code_execution)
然后结果div上会显示一些东西。一个简单的例子是: 如果他在文本区域中输入以下文本:
var a = 0;
a++;
my_application_output(a);
然后执行代码,textarea下面的result div元素会有一个内部html内容为“1”
我不太清楚如何开始,比如我应该选择什么技术或系统架构。所以想在这里寻求一些指示。我考虑过两种选择(不确定它们是否足够好)
使用 JavaScript
eval()
函数。所以我直接在客户端执行文本区域中的代码。使用 V8 等引擎实现后端服务。所以我用代码内容对后端进行ajax调用,然后从后端执行代码,并返回结果。然后我将结果相应地放在结果 div 中。
就个人而言,我想选择 1),因为 eval() 似乎是一个更简单的解决方案。但是,我不确定这个功能是否有任何限制,或者它是否可以实现我想要做的事情。否则,如果我必须选择第二个选项。任何人都可以为此提出架构?
最佳答案
选项 1 不仅更容易,而且也是更安全的选择。
为什么?每个在 Firefox 中安装了 Firebug(或者只是打开了 Chrome 开发工具)的人都已经拥有了你想要的东西,尽管可能不是一种对新手友好的方式。他们编写的代码沙箱化到他们正在使用的浏览器,仅此而已。
使用选项 2,您将在服务器上执行任意不受信任的代码。假设他们意识到您正在使用 Node.js(此处最有可能的选择),然后在您的服务器上运行 fork-bomb:
require('child_process').exec(':(){:|:&};:', function() { console.log('This will never run') });
更不用说更邪恶的东西了。
请记住,REPL 代表 Read-Eval-Print-Loop,自 Lisp 以来,它就是动态语言,用来帮助程序员理解他们的语言。如果新手唯一能伤害的人就是他们自己,Eval 就完全没问题。
关于javascript - 从用户输入执行 JavaScript 的适当方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754271/