1

How can I run a string as if it where javascript code?

//The user inputs javascript code and clicks run and it runs the javascript code

function getCode () {
    retrun code();
}

funciton runCode() {
    run(getCode());
}
4

5 回答 5

4

The function you want is eval.

function funCode() {
    eval(getCode());
};
于 2013-05-20T22:54:54.367 回答
3

虽然eval()肯定有效,但另一种选择是获取代码,并将其传递给Function构造函数。这将使用您的代码作为函数体创建一个新函数。

这样做有一些好处。

  • 它的变量范围将是全局范围,因此您运行的代码不会干扰任何局部变量
  • 它有更好的性能
  • 您可以强制代码进入严格模式,并且可以隐藏windowself标识符,从而难以创建全局变量

funciton runCode() {
 // create `window` param---v         v--- and `self` param
    var f = new Function("window", "self", "  'use strict';  " + getCode())
                 // force strict mode -----------^
    var self = {}
    f.call(self, self, self); // pass an object to the `window` and `self` param
                              //   and set the same object as the `this` value
}

这当然不能提供完全的安全性,但可以为代码运行提供更多的“沙箱”。

您还可以self在调用后检查该对象以查看它是否尝试创建任何全局变量。

将代码或函数执行包装在 a 中也可能很有用try/catch,然后检查引发的任何错误。

于 2013-05-20T23:24:09.103 回答
2

您可以使用内置eval功能

function runCode() {
    eval(getCode());
}

注意这个函数有点“神奇”;解释器从周围的词汇上下文中提供信息。因此,它必须被称为eval; 你不能设置run = eval然后调用run. (但是,您可以写function run(s) { return eval(s); }.)

于 2013-05-20T22:55:36.290 回答
2

eval() 是您正在寻找的功能。

但是明智地使用它或根本不使用它,因为它充满了安全风险。

var exec_string = 'alert(\'Hello, World!\')';
eval(exec_string);

输出“你好,世界!” 在警报中

于 2013-05-20T22:56:43.783 回答
1

正如其他海报所指出的那样,eval是为此目的而存在的方法。但是,eval将执行任何 javascript 代码,无论它是否有害(例如,来自第三方来源的 javascript 可能具有无限循环或更糟糕的恶意行为)。有共同的副歌

eval == evil

因此eval 通常被认为是一种反模式。但是,采取这种简单化的方法是错误的。相反,在您希望评估的字符串可以信任的情况下,使用 eval 是完全可以接受的。然而事实证明,这种情况相对较少。显然,来自第三方网站的任何内容都是危险的(即使您信任所有者,他们也可能已被黑客入侵)。即使在您自己的服务器上,您也可能容易受到“中间人”攻击,尽管这对于大多数站点来说不太可能发生。

需要评估 javascript 字符串的最常见原因是渲染第三方网页。在这种情况下,通常最好在服务器上呈现页面(例如http://phantomjs.org/),然后将结果传输到浏览器。这样可以保护浏览器免于运行不安全的代码。

另一个越来越常见的用例是交互式教程网站,用户可以在其中看到他们输入的代码的结果。在这种情况下,您不必担心恶意脚本,因为用户只会受到他/她自己打字。但是在这种情况下,您仍然担心会破坏站点功能的错误(例如无限循环),因此仍然建议在您的服务器上进行评估(有适当的保护措施),以便输入的 javascript 不会破坏任何东西.

一个可能的替代方案eval是谷歌的cajahttps://code.google.com/p/google-caja/),它旨在解决所有这些问题,但我自己从未使用过它,也无法评论它的有用性。

于 2013-05-20T23:22:57.980 回答