0

我实现了一个内置在网页中的 javascript 解析器。用户可以将 javascript 代码放在文本区域中,例如:

var i = 0;
i++;
var y = i * 10;
document.write(y);

被解析以生成一些输出(例如,document.write 流等)。

生成textarea更改事件时调用函数parse 。

function parse(text) {
    try {
        ....
        eval(text);
    } catch (e) {
        ....
        return {
            status : false, output : ..., ... : ...
        };
    }
    return {
        status : true, output : ...., ... : ...
    };
}

for(var i=0; i<10; )一切正常,但是当用户在文本区域(例如, )中编写循环时我遇到问题,while(true)因为应用程序进入循环。

为了避免这个问题,我会问大家一些关于这个问题的问题/解决方案:

  1. 是否有一些 javascript 库或函数允许 eval使用 javascript 代码但没有循环?
  2. 我可以要求在固定时间执行我的解析函数吗?在这段时间之后,我会生成一个停止 eval 函数的异常。
  3. 在调用之前,eval(text)我可以调用一个checkIfThereAreLoops函数来分析文本,寻找类似for(var i=0; i<10; )or的模式while(true)。这是一个好的解决方案吗?我可以使用正则表达式来寻找这些模式吗?
4

1 回答 1

1

如果您试图查看任意代码是否会终止,那么您将在一段时间内遇到Halting Problem is NP-Hard

因此,您认为您需要对解析函数采取预防措施以超时或消除不安全输入是正确的。

我不知道在eval没有浏览器施加“此脚本运行时间过长”限制的情况下中断的方法,因此您需要清理输入并且不使用循环评估任何内容:这将很棘手,因为您不能只需搜索诸如for, whileetc 之类的结构并避免递归函数调用。

这是一个很难解决的问题...

一个“hacky”解决方案可能是将一个唯一的变量声明插入到输入代码的顶部(当然是隐藏的),并从输入代码中每隔一行递增这个变量(同样,隐藏这些插入并允许语法结构成为坏了。还要在每个增量处插入完整性检查if unique_var > 99999 exit;(其中 99999 是您施加的一些限制)。

这至少应该停止无限循环。

于 2013-03-21T09:42:12.497 回答