首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

安全簡報:正則表達式拒絕服務攻擊與防禦

     編輯:關於ASP.NET

前言

隨著記憶體保護機制成熟,攻擊者轉向 DoS 勒索。正則表達式 DoS (ReDoS) 成為新威脅:編寫不當的 Regex 可能因惡意輸入導致指數級回溯,癱瘓服務。本文解析成因並提供模糊測試工具程式碼。

回溯:問題根源

  • .NET 使用 NFA (非確定性有限自動機) 引擎,支援回溯與捕獲群組。
  • NFA 對每個字元可能計算多次,肯定匹配快,否定匹配需窮盡所有路徑。

線性與指數級回溯對比

安全範例:^\d+$ 匹配 123456X,僅回溯 6 次(線性)。

危險範例:^(\d+)$ 加上捕獲群組,同樣輸入導致回溯路徑爆炸,處理時間隨字元數呈指數增長。

攻擊向量

  • 巢狀量詞:(a+)+、(a*)*
  • 重疊選項:(a|a?)+
  • 長輸入配合惡意模式,可使 CPU 佔用 100% 持續數小時。

防禦策略

  1. 避免巢狀量詞與捕獲群組,改用非捕獲群組 (?:...)。
  2. 使用具備超時機制的 Regex:.NET 4.5+ 支援 Regex.Match(input, pattern, RegexOptions.None, TimeSpan.FromSeconds(1))。
  3. 靜態分析與模糊測試:部署前掃描專案中所有 Regex,生成隨機輸入測試執行時間。

模糊測試程式碼片段

public static void FuzzRegex(string pattern, int iterations = 10000)
{
    var regex = new Regex(pattern);
    var random = new Random();
    for (int i = 0; i < iterations; i++)
    {
        var input = GenerateRandomString(random, 100);
        var sw = Stopwatch.StartNew();
        regex.IsMatch(input);
        sw.Stop();
        if (sw.ElapsedMilliseconds > 100)
            Console.WriteLine($"Slow: {sw.ElapsedMs}ms | Input: {input}");
    }
}

總結

ReDoS 雖不竊取資料,卻能癱瘓服務。開發者應將 Regex 視為潛在攻擊面,納入安全開發週期 (SDL) 進行靜態掃描與執行期超時防護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved