javascript - 从用户输入执行 JavaScript 的适当方法?

标签 javascript eval v8 execution

我需要构建一个允许用户输入 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”

我不太清楚如何开始,比如我应该选择什么技术或系统架构。所以想在这里寻求一些指示。我考虑过两种选择(不确定它们是否足够好)

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

  2. 使用 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/

相关文章:

java - Java中如何将字符串转换为函数?

javascript - V8 Javascript 堆转储模式

node.js - 如何确定给定内存限制的 Node --max_old_space_size?

Javascript 优化、V8 引擎和 Typescript

javascript - 使用 Mongoose 通过传递选项 JSON 来过滤数据 DB 级别

php - 数组 : set value using dot notation?

c# - 解析非标准 JSON

javascript - eval() 的替代方案

javascript - 添加和删​​除类

javascript - 如果单击上一页上的按钮,则自动滚动