正則表達式爲dangerous,very dangerous。正則表達式操作由主線程處理,主線程正在偵聽事件循環。是否有可能確保一個危險的正則表達式不會中止我的應用程序?我是否應該將正則表達式操作傳遞給我自己的thread pool?這是否有規範?當然,測試,監測等工作將會完成,但有沒有一種防止這種災難的通用方法?防止危險正則表達式中止應用
回答
您可以使用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
對不起,我無法提供任何測試細節,但想法是一旦達到您設定的超時時間,結果就認爲失敗。它[類似於.NET中的方法](http://stackoverflow.com/questions/7616435/how-do-i-timeout-regex-operations-to-prevent-hanging-in-net-4-5) –
沒關係。答案很好。我發現這是第一個品味http://www.davidmclifton.com/2011/08/18/node-js-virtual-machine-vm-usage/ – alkis
- 1. 如何防止正則表達式正則表達式中的空格驗證
- 2. 防止在我的javascript中的正則表達式格式化
- 3. HTML5中的模式正則表達式可以防止空白?
- 4. 用正則表達式阻止
- 5. 在正則表達式中禁止「//」(javascript)
- 6. 如何防止使用Java正則表達式重複字符
- 7. 使用正則表達式防止SQL注入?
- 8. 防止前後的空格用正則表達式
- 9. 防止前導空格用正則表達式
- 10. 防止在使用Hive正則表達式時插入NULL Serde
- 11. 防止正則表達式中的災難性回溯
- 12. 允許並防止正則表達式中的某些字符?
- 13. 正則表達式模式以防止彼此相鄰
- 14. 正則表達式,以防止相鄰重複破折號
- 15. 防止CKEDITOR從通過正則表達式或兩個字符
- 16. 防止XSS或其他東西的正則表達式?
- 17. 正則表達式 - 防止重複字符
- 18. 正則表達式來防止SQL注入
- 19. 防止正則表達式從吞食比賽
- 20. 如何防止正則表達式轉換bbcode超鏈接?
- 21. jQuery - 正則表達式,以防止任何特殊字符
- 22. 密碼正則表達式驗證:防止空間
- 23. 正則表達式驗證以防止垃圾郵件註冊?
- 24. 角度正則表達式來防止名稱後的空白
- 25. 如何寫一個正則表達式,防止部分匹配
- 26. 防止正則表達式組包含前一個字符?
- 27. 紅寶石正則表達式 - 防止重疊匹配
- 28. 如何防止通過正則表達式感嘆號
- 29. 正則表達式Lookarounds,防止前後匹配
- 30. 如何防止循環的正則表達式的URL重寫
見https://www.josephkirwin.com/2016/03/12/nodejs_redos_mitigation/ –
這看起來太棒了!你能提供這個答案嗎? – alkis
我在手機上,無法很好地對代碼進行格式化。我現在也在旅途中。在大約20分鐘 –