正規表現をリリース前にテストする
パターン構文の検証、キャプチャグループによるすべてのマッチの検査に加え、正規表現を障害に変えてしまうバックトラッキングの落とし穴を学びましょう。
- 1 正規表現テスター →
パターン(フラグは省略可)とテスト入力を入力してください。すべてのマッチがキャプチャグループとともに一覧表示されるため、グループ 1、2、… に何が入るかを正確に確認できます。空のマッチも含まれます。空のマッチは無限ループせず、マークされて表示されます。
- 2
リリース前に 3 種類の入力でテストしてください。正常系、空文字列((.*)* のようなパターンは意外な形でマッチします)、そしてパターンを狙った敵対的入力です。アンカーも重要です。^ と $ は、m フラグがあれば行頭/行末、なければ文字列の先頭/末尾に一致します。1 行で動くパターンが複数行テキストで誤動作することがあります。
- 3
バックトラッキングへの注意:(a+)+ や (\w+\s?)* のような入れ子の量指定子は、細工された入力に対して指数関数的に爆発する可能性があります。これが ReDoS で、実際の可用性の脆弱性です。このツールはワーカーでハードタイムアウト付きでパターンを実行するため、病的なパターンはブラウザーを凍結させずにここで失敗します。ただし、本番サーバーには同じガード(または RE2 のような線形時間保証のある正規表現エンジン)が必要です。
- 4 正規表現置換ツール →
パターンが確認できたら、コードに組み込む前に、同じテストコーパスで置換($1 後方参照を含む)をプレビューしてください。
よくある質問
- 壊滅的バックトラッキング(ReDoS)とは何ですか?
- パターンが同じ入力部分文字列を複数の方法でマッチさせられる(入れ子の量指定子、重複する選択)とき、エンジンは指数関数的に多くの組み合わせを試す可能性があります。攻撃者が細工した文字列は、CPU を何時間も占有できます。1 つの HTTP パラメーターによるサービス拒否です。
- マッチがなぜ空文字列を返すのですか?
- すべての部分が省略可能なパターン(例: (a)*)は、すべての位置で空文字列にマッチします。ツールはこれらを表示するため、必須の要素か長さのガードを追加できます。