설명
사용자 입력을 정규식 패턴으로 직접 사용하면 공격자가 비싼 정규식이나 예기치 않은 패턴을 주입해 서비스 거부 또는 검증 우회를 유발할 수 있습니다.
잠재적 영향
- 정규식 처리 지연으로 인한 서비스 거부
- 입력 검증 우회
- 예외 발생 또는 기능 중단
해결 방법
- 사용자 입력은
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)
}
설명:
- 변경 전: 입력이 정규식 문법으로 해석됩니다.
- 변경 후: 입력을 이스케이프해 리터럴 텍스트로 처리합니다.
전체 문자열 일치 여부 등 추가 검증 조건은 호출 목적에 맞게 별도로 적용해야 합니다.