Когато регулярните изрази се обърнат срещу производителността
Един-единствен ред от регулярния израз в C# може да срине производствения API. Лошо написаните шаблони предизвикват катастрофално връщане назад, изгаряне на процесорни цикли и заключване на нишки. Това е класиката. Отказ на услуга чрез регулярни изрази (ReDoS), фин, но опасен вектор на атака, скрит във вашия код.
⚠️Несигурен пример, само за образователни цели. Не използвайте в продукция.
string pattern = @"(a+)+$"; // Vulnerable regex c# Regex regex = new Regex(pattern); bool isMatch = regex.IsMatch("aaaaaaaaaaaaaaaaaaaaaaaa!"); Този регулярен израз за C# страда от вложени квантификатори, които причиняват експоненциално връщане назад. Дълъг, злонамерен низ може да замрази крайна точка или микросървис.
Защитена версия:
string pattern = @"^a+$"; // Safe simplified regex for C# Regex regex = new Regex(pattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(200)); bool isMatch = regex.IsMatch("aaaaaaaaaaa"); Образователна бележка: Винаги използвайте таймаути (Опции за регулярни изрази + Период от време) и опростяване на вложени групи. В regex c#, валидирането на производителността е изискване за сигурност, а не оптимизация.
Защо C# Regex шаблоните стават уязвими
Нееднозначни квантификатори (.*, .+ или (а+)+) и неограниченото повторение правят регулярните изрази често срещана DoS цел.
Когато те се появяват в потребителски контексти, като например валидиране на входни данни или парсиране на лог файлове, един-единствен създаден полезен товар може да монополизира процесора.
⚠️Несигурен пример, само за образователни цели. Не използвайте в продукция.
// 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 Защитена версия:
// 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"); Образователна бележка: Избягвайте двусмислени повторения, ограничете размера на входните данни и винаги сравнявайте производителността на регулярните изрази под натоварване. Функционален фрагмент, налагащ времеви ограничения и максимална дължина на входа като предпазители в продукцията.
Реално въздействие върху API и CI/CD Работни потоци
Небезопасните регулярни изрази за C# не се ограничават само до формуляри за валидиране. Разработчиците вграждат шаблони във филтри за логове, съпоставители на уеб куки и автоматизирани сканирания. CI/CD, един опасен модел може да спре целия pipeline.
⚠️Несигурен пример, само за образователни цели. Не използвайте в продукция.
// 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.Никога не обработвайте предоставени от потребителя регулярни изрази без валидиране или контрол на времето за изчакване.
Защитена версия:
// 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 */ } } Образователна бележка: Валидирайте външния регулярен израз преди изпълнение. Добавете изрични проверки за дължина и наложете времеви ограничения в pipelines.
Безопасни практики за предотвратяване на DoS от C# Regex
Предотвратяването на ReDoS в regex c# трябва да бъде вградено във вашата разработка и Работен процес на DevSecOps. Ето как да го направите безопасно по подразбиране:
Най-добри практики
- Винаги задавайте време за изчакване при всички оценки на регулярни изрази.
- Избягвайте катастрофални модели, без вложени квантификатори или двусмислени групи.
- Ограничаване на входния размер преди да се премине към регекс.
- Предкомпилиране на надеждни модели с RegexOptions.Compiled.
- Почистване на изрази, предоставени от потребителя или разрешени модели в белия списък.
Мини превантивен контролен списък
- Прегледайте всеки регулярен израз за употреба на C# във вашата кодова база.
- Кандидатствай Период от време таймаутите последователно.
- Ограничете дължината на входните данни за API и CI.
- Тествайте производителността на регулярните изрази преди пускането им.
- Автоматизиране на статични регулярни изрази сканиране в CI/CD.
Образователна бележка: Третирайте шаблоните за регулярни изрази като ненадежден код. Те заслужават същото внимание като SQL или изпълнението на команди.
Как Xygeni открива рискова употреба на регулярни изрази в C#
Ксигени Code Security автоматично открива опасни шаблони на регулярни изрази в C# по време на статичен анализ. Той идентифицира катастрофални връщания назад, липсващи таймаути и модели, които е вероятно да замразят услугите. In CI/CD, Ксигени действа като a DevSecOps порта, блокирайки опасни регулярни изрази за C#, преди да се слеят или разгърнат.
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Regex Safety Scan run: dotnet xygeni validate --rules regex ,performance --fail-on-riskОбразователна бележка: Интегрирането на Xygeni осигурява сигурна обработка на регулярни изрази в различни компилации и среди, предотвратявайки регресии и излагане на DoS преди внедряването.
Вашият Regex е мощен, уверете се, че не е оръжие
Уязвимостите на ReDoS превръщат невинно изглеждащите регулярни изрази в C# в оръжие за отказ от услуга. Небезопасните регулярни изрази за C# шаблони са често срещан пропуск, докато не замразят производството или не прекъснат работата. CI/CD.
Направете безопасността на регулярните изрази част от хигиената на кодирането си:
- Винаги използвайте таймаути.
- Избягвайте вложени квантификатори.
- Ограничете потребителския вход.
- Автоматизирайте проверките с помощта на Xygeni Code Security.
Regex винаги ще бъде мощен, но с внимателно проектиране, вашите C# шаблони за regex няма да се превърнат в следващия ви доклад за инцидент.






