如何执行用户在我的页面上输入到我的 ACE 编辑器的代码

Posted

技术标签:

【中文标题】如何执行用户在我的页面上输入到我的 ACE 编辑器的代码【英文标题】:How can I execute code that a user inputs into my ACE editor on my page 【发布时间】:2014-05-07 03:29:02 【问题描述】:

我在我的页面上使用ACE Editor 作为我的文本编辑器,用户将输入代码。

    如果可能,我希望执行用户在浏览器中输入的代码。如何从编辑器获取输入并使用 Browsers V8 javascript 编译器?

    然后我将尝试在 Node.js 上运行它,但首先我必须学习 Node :)。

【问题讨论】:

你成功完成这项工作了吗?很想知道你是怎么做到的? 【参考方案1】:

获取一些用户输入的代码并使用 JavaScript 运行它相对简单。本质上,您将从 ACE 获取代码:

var code = editor.getValue();

然后使用 javascript 运行它。在最简单的层面上,您可以这样做:

eval(code);

但是,你probably don't want to use eval()。相反,您可能会执行以下操作:

// grabbed from https://***.com/questions/6432984/adding-script-element-to-the-dom-and-have-the-javascript-run
var script = document.createElement('script');
try 
  script.appendChild(document.createTextNode(code));
  document.body.appendChild(script);
 catch (e) 
  script.text = code;
  document.body.appendChild(script);

这会奏效。但是,它仍然会导致一些问题,因为那时用户代码可能会影响您的环境。在这种情况下,从安全角度来看,它可能并不可怕(除非用户可以共享他们的代码),但它会令人困惑。因此,您需要sandbox your code。

This answer explains sandboxing client side javascript,使用window.postMessage,您可以将 javascript 发送到沙盒 iframe 并在那里对其进行评估。

如果您希望将此服务器端引入并执行 Node 代码,则需要以不同的方式进行沙盒。 在服务器上,沙盒更令人担忧,因为用户可以使用 Javascript 做更多事情,并且可能与您的服务器进行恶意交互。幸运的是,有 a few sandboxes for Node that should help。

【讨论】:

谢谢你,尼克,我很感激。【参考方案2】:

获取代码很简单,只需执行code = editor.getValue() 简单地使用 V8 编译器也很简单,创建 iframe 并执行

try 
    var result = iframeWindow.eval(code)
 catch(e) 
    // report error...

但这不会很有用,因为它很容易创建无限循环并破坏页面。 你可以看看https://github.com/jsbin/jsbin/blob/master/public/js/runner/loop-protect.js#L7来解决循环问题。

【讨论】:

谢谢,我会调查的。我还将发布我已经拥有的代码。

以上是关于如何执行用户在我的页面上输入到我的 ACE 编辑器的代码的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试将我的表单链接到我的 PHP 页面,并且我想在用户单击提交按钮时将用户的输入打印到该页面上

登录到我的 wordpress 网站后,用户需要执行一些额外的安全步骤吗?

如何在我的 ASP.NET MVC 应用程序中使用 ACE?

从 Node.js 服务器自动发布到我的 Facebook 页面

如何在影子根目录中使用 Ace 编辑器?

如何将 Ace 编辑器中的所有文本保存在 WT 中?