När reguljära uttryck vänder mot prestanda
En enda rad med C# regex kan få ett produktions-API att gå på knä. Dåligt skrivna mönster utlöser katastrofala backtracking, brinnande CPU-cykler och låsande trådar. Detta är den klassiska Denial of Service för reguljära uttryck (ReDoS), en subtil men farlig attackvektor gömd i din kod.
⚠️Osäkert exempel, endast för utbildningsändamål. Använd inte i produktion.
string pattern = @"(a+)+$"; // Vulnerable regex c# Regex regex = new Regex(pattern); bool isMatch = regex.IsMatch("aaaaaaaaaaaaaaaaaaaaaaaa!"); Denna regex för C# lider av kapslade kvantifierare som orsakar exponentiell backtracking. En lång, skadlig sträng kan frysa en slutpunkt eller mikrotjänst.
Säker version:
string pattern = @"^a+$"; // Safe simplified regex for C# Regex regex = new Regex(pattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(200)); bool isMatch = regex.IsMatch("aaaaaaaaaaa"); Utbildningsanmärkning: Använd alltid timeouts (Regexalternativ + Tidsrymd) och förenkla kapslade grupper. I regex C# är prestandavalidering ett säkerhetskrav, inte en optimering.
Varför C# Regex-mönster blir sårbara
Tvetydiga kvantifierare (.*, .+, eller (a+)+) och obegränsad repetition gör regex till ett vanligt DoS-mål.
När dessa förekommer i användardrivna sammanhang, som indatavalidering eller loggparsning, kan en enda skapad nyttolast monopolisera CPU:n.
⚠️Osäkert exempel, endast för utbildningsändamål. Använd inte i produktion.
// 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 Säker 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"); Utbildningsanmärkning: Undvik tvetydig upprepning, begränsa inmatningsstorleken och jämför alltid regex-prestanda under belastning. Funktionellt snippet, framtvinga timeouts och maximal indatalängd som guards i produktion.
Verklig inverkan i API:er och CI/CD Arbetsflöden
Osäker regex för C# är inte begränsad till valideringsformulär. Utvecklare bäddar in mönster i loggfilter, webhook-matchare och automatiserade skanningar. CI/CD, ett osäkert mönster kan stoppa hela pipeline.
⚠️Osäkert exempel, endast för utbildningsändamål. Använd inte i produktion.
// 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.Bearbeta aldrig användarlevererade regex utan validering eller timeout-kontroll.
Säker 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 */ } } Utbildningsanmärkning: Validera extern regex-inmatning före körning. Lägg till explicita längdkontroller och framtvinga timeouts i pipelines.
Säkra metoder för att förhindra C# Regex DoS
ReDoS-förebyggande åtgärder i regex C# bör integreras i din utveckling och DevSecOps-arbetsflöde. Så här gör du det säkert som standard:
Best Practices
- Ställ alltid in timeouts på alla regex-utvärderingar.
- Undvik katastrofala mönster, inga kapslade kvantifierare eller tvetydiga grupper.
- Begränsa inmatningsstorleken innan den går över till regex.
- Förkompilera betrodda mönster med RegexOptions.Kompilerad.
- Sanera användarlevererade uttryck eller vitlista tillåtna mönster.
Mini-förebyggande checklista
- Granska varje regex för C#-användning i din kodbas.
- Ansök Tidsrymd timeouts konsekvent.
- Begränsa ingångslängderna på API- och CI-ingångar.
- Testa regex-prestanda före lansering.
- Automatisera statisk regex skanning in CI/CD.
Utbildningsanmärkning: Behandla regex-mönster som otillförlitlig kod. De förtjänar samma granskning som SQL eller kommandokörning.
Hur Xygeni upptäcker riskabel C# Regex-användning
Xygeni Code Security upptäcker automatiskt osäkra regex C#-mönster under statisk analys. Den identifierar katastrofala bakåtsträningar, missade timeouts och mönster som sannolikt hänger sig i tjänster. In CI/CD, Xygeni fungerar som en DevSecOps-grind, vilket blockerar osäker regex för C# innan den sammanfogas eller distribueras.
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Regex Safety Scan run: dotnet xygeni validate --rules regex ,performance --fail-on-riskUtbildningsanmärkning: Integrering av Xygeni säkerställer säker hantering av regex mellan olika versioner och miljöer, vilket förhindrar regressioner och DoS-exponering före distribution.
Din Regex är kraftfull, se till att den inte är beväpnad
ReDoS-sårbarheter förvandlar oskyldigt utseende C# regex till ett denial-of-service-vapen. Osäkra regex för C#-mönster är ett vanligt misstag, tills de fryser produktionen eller går sönder CI/CD.
Gör regex-säkerhet till en del av din kodningshygien:
- Använd alltid timeouts.
- Undvik kapslade kvantifierare.
- Begränsa användarinmatning.
- Automatisera kontroller med hjälp av Xygeni Code Security.
Regex kommer alltid att vara kraftfullt, men med noggrann design kommer dina regex C#-mönster inte att bli din nästa incidentrapport.






