2016-10-15 30 views
3

正則表達式爲dangerous,very dangerous。正則表達式操作由主線程處理,主線程正在偵聽事件循環。是否有可能確保一個危險的正則表達式不會中止我的應用程序?我是否應該將正則表達式操作傳遞給我自己的thread pool?這是否有規範?當然,測試,監測等工作將會完成,但有沒有一種防止這種災難的通用方法?防止危險正則表達式中止應用

+1

見https://www.josephkirwin.com/2016/03/12/nodejs_redos_mitigation/ –

+0

這看起來太棒了!你能提供這個答案嗎? – alkis

+1

我在手機上,無法很好地對代碼進行格式化。我現在也在旅途中。在大約20分鐘 –

回答

1

您可以使用Node.js的核心虛擬機模塊的技巧。 (在v0.12.x,v4.x和v5.x分支中提供)在Mitigating Catastrophic Backtracking in Node.js Regular Expressions中描述。這個想法是設置一個超時到一個正則表達式匹配操作,並終止匹配,一旦達到指定的時間段。

以下是文章的一個片段,你可以利用:

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 
+1

對不起,我無法提供任何測試細節,但想法是一旦達到您設定的超時時間,結果就認爲失敗。它[類似於.NET中的方法](http://stackoverflow.com/questions/7616435/how-do-i-timeout-regex-operations-to-prevent-hanging-in-net-4-5) –

+0

沒關係。答案很好。我發現這是第一個品味http://www.davidmclifton.com/2011/08/18/node-js-virtual-machine-vm-usage/ – alkis

相關問題