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+Einleitung
Reguläre Ausdrücke können Ihre Anwendung mit der richtigen Eingabe für Sekunden oder Minuten einfrieren. Katastrophales Backtracking tritt auf, wenn Regex-Engines exponentiell zunehmende Pfade erkunden, während sie versuchen, ein Muster abzugleichen. Ein Regex wie (a+)+b dauert Mikrosekunden, um eine gültige Eingabe abzugleichen, kann aber Stunden dauern, um eine Zeichenkette von 'a's ohne nachfolgendes 'b' abzulehnen. Angreifer nutzen dies durch Regular Expression Denial of Service (ReDoS)-Angriffe aus, indem sie manipulierte Eingaben senden, die Ihre Regex-Engine dazu bringen, 100 % CPU zu verbrauchen, bis Anforderungs-Timeouts auftreten oder der Prozess abstürzt.
Warum es wichtig ist
Sicherheitsimplikationen (ReDoS-Angriffe): Ein Angreifer kann Ihre Anwendung mit einer einzigen Anfrage, die manipulierte Eingaben enthält, 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 Payloads.
Leistungsverschlechterung: Normale Benutzereingaben können katastrophales Backtracking auslösen, wodurch die Antwortzeiten von Millisekunden auf Sekunden ansteigen. Dies führt zu unvorhersehbarer Latenz, die schwer zu debuggen ist, da sie nur bei spezifischen Eingabemustern auftritt.
Produktionsvorfälle: Anfällige Regex blockiert den Event-Loop in Node.js oder verbraucht Thread-Pool-Ressourcen. Wenn sich Anfragen häufen, steigt der Speicherverbrauch und das System reagiert nicht mehr. In Microservices führt eine anfällige Regex zu Kaskadenfehlern bei abhängigen Diensten.
Schwierigkeit bei der Erkennung: Muster, die bei Tests mit kurzen Eingaben einwandfrei funktionieren, werden bei längeren Eingaben exponentiell langsam. Die Schwachstelle bleibt oft bis zur Produktion unbemerkt und erfordert einen Notfall-Deployment während eines aktiven Incidents.
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_\\-\\.]+)+ exponentielles Backtracking erzeugen. Für eine E-Mail wie aaaaaaaaaaaaaaaaaaaaaaaaa!, versucht die Regex-Engine unzählige Kombinationen, bevor sie fehlschlägt. Die URL-Regex weist mehrere verschachtelte Quantifizierer auf, die das Problem verschärfen, wodurch sie mit Eingaben wie langen Zeichenketten gültiger Zeichen ohne die erwartete Struktur trivial ausnutzbar wird.
✅ 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 verschachtelter Quantifizierer eliminiert katastrophales Backtracking. Einzelne Quantifizierer 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.
Fazit
Die Performance von regulären Ausdrücken ist ein Sicherheitsrisiko, nicht nur eine Optimierung. Überprüfen Sie alle Regex-Muster auf verschachtelte Quantifizierer, überlappende Zeichenklassen in Wiederholungsgruppen und mehrdeutige Alternativen. Testen Sie Regex-Muster mit pathologischen Eingaben (lange Zeichenketten gültiger Zeichen, gefolgt von ungültigen Endungen), um katastrophales Backtracking vor der Bereitstellung zu identifizieren. Ersetzen Sie, wenn möglich, komplexe Regex durch String-Parsing-Funktionen mit vorhersehbaren Performance-Eigenschaften.
.avif)
