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