安全でない直接オブジェクト参照

C#の安全でない直接オブジェクト参照

説明

プロフィールやアカウントの取得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を取得する必要があります。管理者によるアクセスも必要なら、別のサーバー側の認可ポリシーで確認してください。

参考資料