説明
外部入力から NSPredicate(format:) の書式文字列を組み立てると、攻撃者に条件式を変更され、意図しないオブジェクトの取得やフィルターの回避につながるおそれがあります。
想定される影響
- アクセス権限のないオブジェクトの取得
- フィルター条件の回避
- アプリケーションの処理の回避やデータの漏えい
対処方法
NSPredicate(format:)の書式文字列は固定します。- 値は
%@のプレースホルダーに対応する別の引数として渡します。 - 動的なフィールド名や演算子は許可リストから選びます。
例
変更前
swift
let predicate = NSPredicate(format: "name == '\(username)'")
変更後
swift
let predicate = NSPredicate(format: "name == %@", username)
説明:
- 変更前: ユーザー入力が述語の構文として解釈されます。
- 変更後: ユーザー入力を値の引数としてだけ渡します。