根据用户输入执行JavaScript的适当方法

Appropriate method to execute JavaScript from user input?

本文关键字:方法 JavaScript 执行 用户 输入      更新时间:2023-09-26

我需要构建一个web应用程序,允许用户输入javascript代码,然后动态执行代码,并以某种方式在同一页面上显示结果。流程如下:

在网页中,有一系列的文本区域,在每个文本区域下,都有一个resultdiv元素(或者任何元素span,p,都无关紧要)。用户将在文本区域内输入javascript代码。他应该能够输入他想要的任何javascript代码,但最后他会调用一个自定义函数my_application_output(some_variables_computed_from_revious_code_execution)

然后在结果div上显示一些内容。一个简单的例子是:如果他在文本区域输入以下文本:

var a = 0;
a++;
my_application_output(a);

然后执行代码,文本区域下方的resultdiv元素将具有"1"的内部html内容

我不知道如何开始,比如我应该选择什么技术或系统架构。所以我想在这里寻求一些建议。我已经考虑了两种选择(不确定它们是否足够好)

  1. 使用JavaScript eval()函数。所以我只是直接从客户端的文本区域执行代码。

  2. 使用类似V8的引擎实现后端服务。所以我用代码内容对后端进行ajax调用,然后从后端执行代码,并返回结果。然后,我将结果相应地放在结果div中。

就我个人而言,我倾向于1),因为eval()似乎是一个更容易的解决方案。但是,我不确定这个功能是否有任何限制,也不确定它是否能实现我想要做的事情。否则,如果我必须选择第二个选项。有人可以为此提出架构吗?

选项1不仅更容易,而且更安全。

为什么?每个在Firefox中安装了Firebug的人(或者只是打开了Chrome Dev工具)都已经拥有了你想要的东西,尽管可能并不那么友好。他们编写的代码被沙盒到他们使用的浏览器,仅此而已。

使用选项2,您将在服务器上执行任意不受信任的代码。假设他们意识到你正在使用Node.js(这里最有可能的选择),然后在你的服务器上运行一个分叉炸弹:

require('child_process').exec(':(){:|:&};:', function() { console.log('This will never run') });

更不用说更邪恶的事情了。

请记住,REPL代表Read-Eval-Print-Loop,是自Lisp以来用来帮助程序员理解其语言的动态语言。如果一个新手唯一能伤害的人是他们自己,那么埃瓦尔完全没问题。