안전하지 않은 직접 객체 참조

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를 받는 프로필 엔드포인트는 다른 사용자의 레코드를 노출할 수 있습니다.
  • 변경 후: 예시는 인증된 사용자 본인의 프로필만 허용합니다. 구현이 생략된 CurrentUserId()는 요청 입력이 아닌 검증된 인증 주체에서 ID를 얻어야 합니다. 관리자 접근이 필요하면 별도의 서버 측 권한 정책으로 검증하세요.

참조