Swiftの正規表現インジェクション

Swiftの正規表現インジェクション

説明

ユーザー入力を正規表現のパターンとして直接使うと、処理負荷の高い式や意図しないパターンを挿入され、サービス拒否や入力検証の回避につながるおそれがあります。

想定される影響

  • 正規表現の処理遅延によるサービス拒否
  • 入力検証の回避
  • 例外の発生や機能の停止

対処方法

  1. ユーザー入力は NSRegularExpression.escapedPattern(for:) でエスケープしてからパターンに含めます。
  2. パターンの構造は固定し、動的な条件は許可リストから選びます。
  3. 複雑なパターンを処理する場合は、入力長と実行時間を制限します。

例

変更前

swift
import Foundation
import UIKit

func buildRegex(inputField: UITextField) throws {
    let input = inputField.text ?? ""
    let regex = try NSRegularExpression(pattern: input)
}

変更後

swift
import Foundation
import UIKit

func buildRegex(inputField: UITextField) throws {
    let input = inputField.text ?? ""
    let escaped = NSRegularExpression.escapedPattern(for: input)
    let regex = try NSRegularExpression(pattern: escaped)
}

説明:

  • 変更前: 入力が正規表現の構文として解釈されます。
  • 変更後: 入力をエスケープし、文字列そのものとして扱います。

文字列全体との一致など、追加の検証条件は呼び出しの目的に合わせて適用してください。

参考資料