当正则表达式不利于性能时
一行 C# 正则表达式就能让生产环境的 API 崩溃。编写不佳的模式会引发灾难性的回溯,消耗大量 CPU 资源,并锁定线程。这就是经典的…… 正则表达式拒绝服务攻击 (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");
教育说明: 始终使用超时(正则表达式选项 + 时间跨度并简化嵌套组。在 C# 正则表达式中,性能验证是安全要求,而非优化。
为什么 C# 正则表达式模式容易受到攻击
歧义量词(.*, .+ 或 (a+)+)和无限重复使得正则表达式成为常见的拒绝服务攻击目标。
当这些攻击出现在用户驱动的场景中时,例如输入验证或日志解析,一个精心构造的有效载荷就可以垄断 CPU 资源。
⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。
// 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# 中的不安全正则表达式不仅限于表单验证。开发人员还会将模式嵌入到日志过滤器、Webhook 匹配器和自动化扫描中。 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.
防止 C# 正则表达式拒绝服务攻击的安全实践
在 C# 正则表达式中,应该将 ReDoS 防护功能内置到你的开发过程中。 DevSecOps 工作流程. 以下是如何将其默认设置为安全的方法:
最佳实践
- 始终设置超时 对所有正则表达式求值。
- 避免灾难性模式没有嵌套量词或歧义词组。
- 限制输入大小 在传递给正则表达式之前。
- 预编译可信模式 - RegexOptions.Compiled.
- 对用户提供的表达式进行清理 或者将模式列入白名单。
迷你预防检查清单
- 检查代码库中所有用于 C# 的正则表达式。
- 在断裂前, 时间跨度 频繁出现超时。
- 限制 API 和 CI 输入的输入长度。
- 发布前测试正则表达式性能。
- 自动化静态正则表达式 扫描中 CI/CD.
教育说明: 将正则表达式模式视为不受信任的代码。它们理应受到与 SQL 或命令执行同等的严格审查。
Xygeni 如何检测 C# 正则表达式的风险使用
西吉尼 Code Security 在静态分析过程中自动检测不安全的 C# 正则表达式模式。 它可以识别灾难性的回溯、超时缺失以及可能导致服务挂起的模式。 In CI/CD, 西吉尼 充当 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 攻击。
你的正则表达式很强大,请确保它没有被恶意利用。
ReDoS 漏洞可以将看似无害的 C# 正则表达式变成拒绝服务武器。 C# 模式中使用不安全的正则表达式是一个常见的疏忽,直到它们导致生产环境崩溃或程序崩溃。 CI/CD.
将正则表达式安全纳入你的编码规范:
- 务必使用超时机制。
- 避免使用嵌套量词。
- 限制用户输入。
- 使用自动化检查 Xygeni Code Security.
正则表达式永远都很强大,但只要精心设计,你的 C# 正则表达式模式就不会成为你的下一个事故报告。





