Swiftの制御されていない書式文字列

Swiftの制御されていない書式文字列

説明

String(format:)、NSString(format:)、NSLog の書式文字列にユーザー入力を使うと、書式指定子が解釈され、例外、情報漏えい、ログの改ざんにつながるおそれがあります。

想定される影響

  • 例外の発生やアプリの異常終了
  • ログの改ざん
  • 意図しないデータの書式処理

対処方法

  1. 書式文字列は固定の定数にします。
  2. ユーザーの値は書式引数として渡し、書式文字列に連結したり埋め込んだりしないでください。
  3. ログには構造化ロギングと適切なマスキング方針を適用します。

例

変更前

swift
let message = String(format: userControlledFormat)

変更後

swift
let message = String(format: "Hello %@", username)

説明:

  • 変更前: ユーザー入力が書式文字列として解釈されます。
  • 変更後: 書式文字列を固定し、ユーザーの値を引数として渡します。

参考資料