2016-10-15 3 views
3

Regexes sind dangerous, very dangerous. Regex-Operationen werden vom Hauptthread verarbeitet, der die Ereignisschleife überwacht. Ist es möglich, sicherzustellen, dass ein gefährlicher Regex meine Anwendung nicht stoppt? Sollte ich die Regex-Operationen an eine eigene thread pool weitergeben? Gibt es dafür eine Norm? Natürlich werden Tests, Überwachungen usw. durchgeführt, aber gibt es einen allgemeinen Ansatz, um diese Art von Katastrophen zu verhindern?Verhindern, dass gefährliche Regex die Anwendung stoppt

+1

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

+0

Das sieht gut aus! Kannst du das als Antwort anbieten? – alkis

+1

Ich bin auf einem Handy und kann den Code nicht gut formatieren. Ich bin jetzt auch unterwegs. In etwa 20 Minuten –

Antwort

1

Sie können einen Trick mit dem vm-Modul von Node.js verwenden. (verfügbar in den Verzweigungen v0.12.x, v4.x und v5.x), beschrieben in Mitigating Catastrophic Backtracking in Node.js Regular Expressions. Die Idee besteht darin, eine Zeitüberschreitung für eine Regex-Vergleichsoperation festzulegen und die Übereinstimmung zu beenden, sobald sie einen bestimmten Zeitraum erreicht hat.

Hier ist ein Ausschnitt aus dem Artikel, den Sie nutzen können:

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

Entschuldigung, ich kann keine Testdetails angeben, aber die Idee ist, dass das Ergebnis als fehlgeschlagen gilt, sobald die von Ihnen festgelegte Zeitüberschreitung erreicht ist. Es ist [ähnlich wie Ansatz in .NET] (http://stackoverflow.com/questions/7616435/how-do-i-timeout-regex-operations-to-prevent-hanging-in-net-4-5) –

+0

Das ist gut. Die Antwort ist großartig, wie es ist. Ich fand das für einen ersten Geschmack http://www.davidmclifton.com/2011/08/18/node-js-virtual-machine-vm-usage/ – alkis

Verwandte Themen