← 資料室 RESOURCE
遅い正規表現とサービス停止を招く破滅的バックトラッキング(ReDoS)を避ける。

正規表現の大半は非常に高速ですが、特定のパターンは入力の長さに応じて実行時間が指数関数的に増大することがあります。これを破滅的バックトラッキングと呼び、悪意ある入力でサーバーを停止させる攻撃をReDoS(正規表現サービス拒否)といいます。

最もよくある原因はネストした量指定子です。(a+)+ や (.*)* のように繰り返しの中に繰り返しが重なり、後ろが失敗すると、エンジンが可能なすべての分割を試みて爆発します。(a|a)* のような曖昧な選択も同じ問題を引き起こします。

予防の核心は曖昧さをなくすことです。重なる繰り返しを一つにまとめ、.* の代わりに [^x]* のように範囲を狭め、可能ならアトミックグループや絶対的量指定子(JavaScriptにはありません)を検討します。入力長の制限も実務で効果的です。

このテスターはブラウザで実行されるため危険なパターンはあなたのタブを少し遅くするだけですが、同じパターンをサーバーで信頼できない入力に使う前には、必ずパフォーマンスを点検してください。