説明
プロフィールやアカウントの取得APIが、リクエストで指定されたユーザーIDをそのまま使い、所有者や権限を確認しない場合、ほかのユーザーのデータが漏れるおそれがあります。
想定される影響
- URLやクエリのIDを変更するだけで、ほかのユーザーの個人情報、アカウント情報、決済情報を取得される可能性があります。
- 管理者専用のデータや内部識別子が外部ユーザーに公開されるおそれがあります。
対処方法
プロフィールの取得には認証を要求し、指定されたIDが現在のユーザーのものか、呼び出し元に管理権限があるかをサーバー側で確認してください。
例
変更前
csharp
[HttpGet("profile/{id}")]
public IActionResult GetProfile(int id)
{
return Ok(repository.Find(id));
}
変更後
csharp
[Authorize]
[HttpGet("profile/{id}")]
public IActionResult GetProfile(int id)
{
if (id != CurrentUserId()) return Forbid();
return Ok(repository.Find(id));
}
解説:
- 変更前: 権限や所有者を確認せずにユーザーIDを受け取るプロフィールAPIは、ほかのユーザーのレコードを漏らすおそれがあります。
- 変更後: この例は、認証されたユーザー本人のプロフィールだけを許可します。実装を省略した
CurrentUserId()は、リクエスト入力ではなく検証済みの認証主体からIDを取得する必要があります。管理者によるアクセスも必要なら、別のサーバー側の認可ポリシーで確認してください。