説明
Realmの filter の条件文字列にユーザー入力を連結すると、条件式を変更され、権限のないデータの取得やフィルター条件の回避につながるおそれがあります。
想定される影響
- ローカルデータベースのフィルターの回避
- アクセス権限のないRealmオブジェクトの取得
- 機密情報の漏えい
対処方法
- Realmのフィルター文字列は固定します。
- ユーザーの値は
%@のプレースホルダーに対応する別の引数として渡します。 - フィールド名や並べ替えの基準は許可リストから選びます。
例
変更前
swift
let matches = users.filter("name == '\(username)'")
変更後
swift
let matches = users.filter("name == %@", username)
説明:
- 変更前: ユーザー入力がRealmの条件式の一部になります。
- 変更後: ユーザーの値を条件式の構造から分離します。