C#-Regex – Reguläre Ausdrücke für C#

C# Regex DoS: Wenn Muster zu Angriffsvektoren werden

Wenn reguläre Ausdrücke der Leistung schaden  

Eine einzige Zeile regulärer Ausdrücke in C# kann eine produktive API lahmlegen. Schlecht geschriebene Ausdrücke führen zu katastrophalem Backtracking, verbrauchen unnötig CPU-Zyklen und blockieren Threads. Das ist der klassische Fall. Denial-of-Service-Angriff mit regulären Ausdrücken (ReDoS), ein subtiler, aber gefährlicher Angriffsvektor, der in Ihrem Code versteckt ist.

⚠️Unsicheres Beispiel, nur zu Schulungszwecken. Nicht in der Produktion verwenden.

string pattern = @"(a+)+$";  // Vulnerable regex c#
Regex regex = new Regex(pattern);
bool isMatch = regex.IsMatch("aaaaaaaaaaaaaaaaaaaaaaaa!");

Dieser reguläre Ausdruck für C# leidet unter verschachtelten Quantifizierern, die exponentielles Backtracking verursachen. Eine lange, bösartige Zeichenkette kann einen Endpunkt oder Microservice zum Einfrieren bringen.

Sichere Version:

string pattern = @"^a+$";  // Safe simplified regex for C#
Regex regex = new Regex(pattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(200));
bool isMatch = regex.IsMatch("aaaaaaaaaaa");

Pädagogischer Hinweis: Verwenden Sie immer Timeouts (RegexOptions + Zeitspanne) und verschachtelte Gruppen vereinfachen. In regulären Ausdrücken in C# ist die Leistungsvalidierung eine Sicherheitsanforderung, keine Optimierung.

Warum C#-Regex-Muster angreifbar werden

Mehrdeutige Quantoren (.*, .+den (a+)+) und unbegrenzte Wiederholungen machen reguläre Ausdrücke zu einem häufigen Ziel von DoS-Angriffen.
Wenn diese in benutzergesteuerten Kontexten auftreten, wie z. B. bei der Eingabevalidierung oder der Protokollanalyse, kann eine einzelne speziell präparierte Nutzlast die CPU monopolisieren.

⚠️Unsicheres Beispiel, nur zu Schulungszwecken. Nicht in der Produktion verwenden.

// Vulnerable email validation regex for C#
var pattern = @"^([a-zA-Z0-9_\-\.]+)@([\w\-]+\.)+([a-zA-Z]{2,4})$";
var input = "a".PadLeft(10000, 'a') + "@example.com";
Regex.IsMatch(input, pattern);  // May hang or cause ReDoS

Sichere Version:

// Safer regex c# pattern
var pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
Regex regex = new Regex(pattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(300));
bool isValid = regex.IsMatch("user@example.com");

Pädagogischer Hinweis: Vermeiden Sie mehrdeutige Wiederholungen, beschränken Sie die Eingabegröße und testen Sie die Regex-Performance stets unter Last. Funktionales Code-Snippet, das Timeouts und maximale Eingabelängen als Schutzmechanismen im Produktivbetrieb erzwingt.

Real Impact in APIs und CI/CD Workflows

Unsichere reguläre Ausdrücke in C# beschränken sich nicht auf Validierungsformulare. Entwickler betten Muster in Logfilter, Webhook-Matcher und automatisierte Scans ein. CI/CDEin einziges unsicheres Muster kann den gesamten Prozess zum Stillstand bringen. pipeline.

⚠️Unsicheres Beispiel, nur zu Schulungszwecken. Nicht in der Produktion verwenden.

// Regex used to match commit messages in a CI job
var regex = new Regex(userInputPattern);
if (regex.IsMatch(commitMessage)) { /* process */ }
If userInputPattern contains (a+)+$, it can freeze the build agent.

Vom Benutzer bereitgestellte reguläre Ausdrücke werden niemals ohne Validierung oder Timeout-Kontrolle verarbeitet.

Sichere Version:

// Safe usage in CI/CD context
if (userInputPattern.Length < 100 && !userInputPattern.Contains("++"))
{
    Regex regex = new Regex(userInputPattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(100));
    if (regex.IsMatch(commitMessage)) { /* safely process */ }
}

Pädagogischer Hinweis: Externe Regex-Eingaben vor der Ausführung validieren. Explizite Längenprüfungen hinzufügen und Timeouts erzwingen. pipelines.

Sichere Vorgehensweisen zur Verhinderung von C#-Regex-DoS

RedoS-Schutz in regulären Ausdrücken in C# sollte von Anfang an in Ihre Entwicklung integriert werden. DevSecOps-Workflow. So stellen Sie sicher, dass es standardmäßig sicher ist:

Praxisbeispiele

  1. Immer Timeouts einstellen bei allen Regex-Auswertungen.
  2. Vermeiden Sie katastrophale Muster, keine verschachtelten Quantoren oder mehrdeutigen Gruppen.
  3. Eingabegröße begrenzen vor der Übergabe an den regulären Ausdruck.
  4. Vertrauenswürdige Muster vorkompilieren und RegexOptions.Compiled.
  5. Benutzereingaben bereinigen oder auf eine Whitelist für zulässige Muster setzen.

Mini-Checkliste zur Prävention

  • Überprüfen Sie jeden regulären Ausdruck auf seine Verwendung in C# in Ihrer Codebasis.
  • Tragen Sie Zeitspanne Regelmäßige Auszeiten.
  • Beschränken Sie die Eingabelängen für API- und CI-Eingaben.
  • Regex-Performance vor der Veröffentlichung testen.
  • Automatisieren Sie statische reguläre Ausdrücke Einscannen CI/CD.

Pädagogischer Hinweis: Reguläre Ausdrücke sollten wie nicht vertrauenswürdiger Code behandelt werden. Sie verdienen die gleiche Sorgfalt wie SQL-Anweisungen oder die Ausführung von Befehlen.

Wie Xygeni riskante C#-Regex-Nutzung erkennt

Xygeni Code Security Erkennt automatisch unsichere reguläre Ausdrücke in C# während der statischen Analyse. Es erkennt katastrophale Rückverfolgungen, verpasste Timeouts und Muster, die wahrscheinlich zum Absturz von Diensten führen. In CI/CD, Xygeni wirkt als DevSecOps-Tor, Blockierung unsicherer regulärer Ausdrücke für C# vor dem Zusammenführen oder Bereitstellen.

# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Regex Safety Scan
  run: dotnet xygeni validate --rules regex ,performance --fail-on-risk

Pädagogischer Hinweis: Durch die Integration von Xygeni wird eine sichere Handhabung regulärer Ausdrücke über verschiedene Builds und Umgebungen hinweg gewährleistet, wodurch Regressionen und DoS-Angriffe vor der Bereitstellung verhindert werden.

Dein regulärer Ausdruck ist mächtig, sorge dafür, dass er nicht missbraucht wird.

ReDoS-Schwachstellen verwandeln harmlos aussehende C#-Regex in eine Denial-of-Service-Waffe. Unsichere reguläre Ausdrücke für C#-Muster sind ein häufiges Versäumnis, bis sie die Produktion lahmlegen oder Fehler verursachen. CI/CD.

Machen Sie die Sicherheit regulärer Ausdrücke zu einem festen Bestandteil Ihrer Programmierhygiene:

  • Verwenden Sie immer Timeouts.
  • Vermeiden Sie verschachtelte Quantoren.
  • Benutzereingaben einschränken.
  • Automatisieren Sie Prüfungen mithilfe von Xygeni Code Security.

Reguläre Ausdrücke werden immer mächtig sein, aber mit sorgfältiger Gestaltung werden Ihre regulären C#-Muster nicht zu Ihrem nächsten Sicherheitsvorfall.

SCA-Tools-Software-Zusammensetzungs-Analyse-Tools
Priorisieren, beheben und sichern Sie Ihre Softwarerisiken
7-Tage kostenlose Testversion
Keine Kreditkarte erforderlich

Sichern Sie Ihre Softwareentwicklung und -bereitstellung

mit der Xygeni-Produktsuite