説明
ユーザー入力を正規表現のパターンとして直接使うと、処理負荷の高い式や意図しないパターンを挿入され、サービス拒否や入力検証の回避につながるおそれがあります。
想定される影響
- 正規表現の処理遅延によるサービス拒否
- 入力検証の回避
- 例外の発生や機能の停止
対処方法
- ユーザー入力は
NSRegularExpression.escapedPattern(for:)でエスケープしてからパターンに含めます。 - パターンの構造は固定し、動的な条件は許可リストから選びます。
- 複雑なパターンを処理する場合は、入力長と実行時間を制限します。
例
変更前
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)
}
説明:
- 変更前: 入力が正規表現の構文として解釈されます。
- 変更後: 入力をエスケープし、文字列そのものとして扱います。
文字列全体との一致など、追加の検証条件は呼び出しの目的に合わせて適用してください。