我意识到在网页中构建了一个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)
)
因为应用程序循环。
为了避免这个问题,我会问你所有关于这个问题的问题/解决方案:
eval
一个javascript代码但是没有循环? eval(text)
之前,我可以调用checkIfThereAreLoops
函数来分析寻找for(var i=0; i<10; )
或while(true)
等模式的文字。这是一个好的解决方案吗?我可以使用正则表达式来寻找这些模式吗?答案 0 :(得分:1)
如果您正在尝试查看是否会终止任意代码,那么您将会遇到the Halting Problem NP-Hard。
所以你认为你需要对你的解析函数进行预防措施才能超时或者解除不安全的输入。
我没有意识到在没有浏览器强加“此脚本运行时间太长”的情况下中断eval
的方法,因此您需要清理输入并且不要使用循环评估任何内容:因为你不能只搜索for, while
等结构并避免递归函数调用,所以会很棘手。
这是一个难以解决的问题......
一个'hacky'解决方案可能是将唯一变量声明插入到输入代码的顶部(当然是隐藏的)并在输入代码中每隔一行递增此变量(再次,隐藏这些插入并允许语法结构被破坏。同时在每个增量if unique_var > 99999 exit;
插入健全性检查(其中99999是你施加的限制)。
这至少应该阻止无限循环。