在运行时解析javascript代码时避免循环

时间:2013-03-21 09:28:37

标签: javascript parsing loops eval

我意识到在网页中构建了一个javascript解析器。 用户可以在文本区域中输入javascript代码,如:

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

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

当生成textarea change 事件时,将调用函数 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; )while(true)等模式的文字。这是一个好的解决方案吗?我可以使用正则表达式来寻找这些模式吗?

1 个答案:

答案 0 :(得分:1)

如果您正在尝试查看是否会终止任意代码,那么您将会遇到the Halting Problem NP-Hard

所以你认为你需要对你的解析函数进行预防措施才能超时或者解除不安全的输入。

我没有意识到在没有浏览器强加“此脚本运行时间太长”的情况下中断eval的方法,因此您需要清理输入并且不要使用循环评估任何内容:因为你不能只搜索for, while等结构并避免递归函数调用,所以会很棘手。

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

一个'hacky'解决方案可能是将唯一变量声明插入到输入代码的顶部(当然是隐藏的)并在输入代码中每隔一行递增此变量(再次,隐藏这些插入并允许语法结构被破坏。同时在每个增量if unique_var > 99999 exit;插入健全性检查(其中99999是你施加的限制)。

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

相关问题