Regel
Wache gegen langsam reguläre Ausdrücke.
Reguläre Ausdrücke mit verschachtelten Quantoren oder
mehrdeutigen Mustern können verursachen. katastrophale
Backtracking und Leistung Probleme.
Unterstützte Sprachen: 45+Einführung
Reguläre Ausdrücke können Ihre Anwendung mit der richtigen Eingabe für Sekunden oder Minuten zum Stillstand bringen. Katastrophales Backtracking tritt auf, wenn Regex-Engines exponentiell ansteigende Pfade erkunden, während sie versuchen, ein Muster zu finden. Ein Regex wie (a+)+b braucht Mikrosekunden, um gültige Eingaben zu erkennen, kann aber Stunden brauchen, um eine Folge von a's ohne nachgestelltes b zurückzuweisen. Angreifer nutzen dies durch ReDoS-Angriffe (Regular Expression Denial of Service) aus, indem sie manipulierte Eingaben senden, die Ihre Regex-Engine zu 100 % CPU-Leistung bringen, bis es zu Anfrage-Timeouts kommt oder der Prozess abstürzt.
Warum das wichtig ist
Auswirkungen auf die Sicherheit (ReDoS-Angriffe): Ein Angreifer kann Ihre Anwendung mit einer einzigen Anfrage mit manipulierten Eingaben lahmlegen. E-Mail-Validierung und URL-Parsing-Muster sind häufige Ziele. Im Gegensatz zu herkömmlichen DoS-Angriffen, die Bandbreite erfordern, benötigt ReDoS nur winzige Nutzdaten.
Leistungsverschlechterung: Normale Benutzereingaben können ein katastrophales Backtracking auslösen, wodurch die Antwortzeiten von Millisekunden auf Sekunden ansteigen. Dies führt zu unvorhersehbaren Latenzzeiten, die schwer zu beheben sind, da sie nur bei bestimmten Eingabemustern auftreten.
Vorfälle in der Produktion: Anfällige Regex blockiert die Ereignisschleife in Node.js oder verbraucht Thread-Pool-Ressourcen. Wenn sich die Anfragen häufen, steigt der Speicherbedarf und das System reagiert nicht mehr. Bei Microservices führt eine anfällige Regex zu kaskadenartigen Ausfällen bei abhängigen Diensten.
Schwierigkeit bei der Erkennung: Muster, die beim Testen mit kurzen Eingaben gut funktionieren, werden bei längeren Eingaben exponentiell langsam. Die Schwachstelle bleibt oft bis zur Produktion unbemerkt und erfordert einen Notfalleinsatz bei einem aktiven Vorfall.
Code-Beispiele
❌ Nicht konform:
function validateEmail(email) {
const regex = /^([a-zA-Z0-9_\-\.]+)+@([a-zA-Z0-9_\-\.]+)+\.([a-zA-Z]{2,5})$/;
return regex.test(email);
}
function extractURLs(text) {
const regex = /(https?:\/\/)?([\w\-])+\.(\w+)+([\w\-\.,@?^=%&:/~\+#]*)+/g;
return text.match(regex);
}
Warum es unsicher ist: Die verschachtelten Quantoren ([a-zA-Z0-9_\\-\\.]+)+ zu exponentiellem Backtracking führen. Für eine E-Mail wie aaaaaaaaaaaaaaaaaaaaaaaaa!probiert die Regex-Engine unzählige Kombinationen aus, bevor sie scheitert. Die URL-Regex hat mehrere verschachtelte Quantifizierer, die das Problem verschlimmern, so dass sie mit Eingaben wie langen Zeichenfolgen ohne die erwartete Struktur trivial ausgenutzt werden kann.
✅ Konform:
function validateEmail(email) {
const regex = /^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z]{2,5}$/;
return regex.test(email);
}
function extractURLs(text) {
const regex = /https?:\/\/[\w\-]+\.[\w\-]+(?:[\w\-\.,@?^=%&:/~\+#]*)?/g;
return text.match(regex);
}
Warum es sicher ist: Das Entfernen von verschachtelten Quantoren verhindert katastrophales Backtracking. Einzelne Quantoren wie [a-zA-Z0-9_\-\.]+ werden in linearer Zeit ausgeführt. Das URL-Muster verwendet nicht-erfassende Gruppen mit optionalem Suffix (?:...)? anstelle von verschachtelten Wiederholungen, was eine vorhersehbare Leistung unabhängig von Eingabelänge oder Inhalt gewährleistet.
Schlussfolgerung
Die Leistung regulärer Ausdrücke ist ein Sicherheitsaspekt, nicht nur eine Optimierung. Überprüfen Sie alle Regex-Muster auf verschachtelte Quantoren, sich überschneidende Zeichenklassen in Wiederholungsgruppen und mehrdeutige Alternativen. Testen Sie Regex-Muster mit pathologischen Eingaben (lange Zeichenketten mit gültigen Zeichen, gefolgt von ungültigen Endungen), um katastrophales Backtracking vor dem Einsatz zu erkennen. Ersetzen Sie, wenn möglich, komplexe Regex durch String-Parsing-Funktionen, die vorhersehbare Leistungsmerkmale aufweisen.
.avif)
