C# 正则表达式 - C# 正则表达式 - C# 正则表达式

C# 正则表达式 DoS:当模式变成攻击向量

当正则表达式不利于性能时  

一行 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 工作流程. 以下是如何将其默认设置为安全的方法:

最佳实践

  1. 始终设置超时 对所有正则表达式求值。
  2. 避免灾难性模式没有嵌套量词或歧义词组。
  3. 限制输入大小 在传递给正则表达式之前。
  4. 预编译可信模式 - RegexOptions.Compiled.
  5. 对用户提供的表达式进行清理 或者将模式列入白名单。

迷你预防检查清单

  • 检查代码库中所有用于 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# 正则表达式模式就不会成为你的下一个事故报告。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件