防止危险的正则表达式暂停应用程序

时间:2016-10-15 08:06:43

标签: regex node.js

正则表达式为dangerousvery dangerous。正则表达式操作由主线程处理,即正在侦听事件循环的主线程。是否有可能确保危险的正则表达式不会停止我的申请?我应该将正则表达式操作传递给我自己的thread pool吗?这有什么规范吗?当然会进行测试,监控等,但有没有一种防止这种灾难的通用方法?

1 个答案:

答案 0 :(得分:1)

您可以使用Node.js的核心vm模块。 ({3}}中描述的(在v0.12.x,v4.x和v5.x分支中可用)。我们的想法是为正则表达式匹配操作设置超时,并在达到指定的时间段后终止匹配。

以下是您可以利用的文章的片段:

const util = require('util'); 
const vm = require('vm'); 
var sandbox = { 
    result: null 
}; 
var context = vm.createContext(sandbox);     
console.log('Sandbox initialized: ' + vm.isContext(sandbox)); 
var script = new vm.Script('result = /^(A+)*B/.test(\'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC\');'); 
try{
     // One could argue if a RegExp hasn't processed in a given time. 
    // then, its likely it will take exponential time. 
    script.runInContext(context, { timeout: '1000' }); // milliseconds 
} 
catch(e){ 
    console.log('ReDos occurred'); // Take some remedial action here... 
} 
console.log(util.inspect(sandbox)); // Check the results