NULL 포인터 역참조

null 참조를 사용하는 Java 코드의 예외와 처리 실패

설명

Java에서 null 참조로 인스턴스 메서드를 호출하거나 필드에 접근하면 NullPointerException이 발생합니다. 조회 결과나 외부 입력이 존재한다고 가정하고 바로 사용하면 요청이나 작업이 실패할 수 있습니다.

잠재적 영향

  • 처리되지 않은 예외로 요청이나 백그라운드 작업이 중단될 수 있습니다. 반복적인 실패는 가용성에 영향을 줄 수 있지만, 일반적인 Java 참조의 null 접근이 곧 프로세스 전체 종료나 메모리 손상을 의미하지는 않습니다.

해결 방법

  1. null을 반환할 수 있는 입력과 조회 결과는 사용 전에 확인하세요.
  2. 값이 없는 정상적인 경우와 프로그램 오류를 구분하고 적절한 응답이나 오류 처리로 연결하세요.
  3. 필수 입력을 검증하고 메서드의 반환 계약을 명확히 하세요.

예시

변경 전

userService, User, UserNotFoundException 등의 선언을 생략한 예시입니다. 변경 후의 예외는 적절한 오류 응답으로 처리하고, User.toString()이 민감한 정보를 노출하지 않는지도 확인하세요.

java
public class UserController {
    public String getUserById(HttpServletRequest request) {
        String userId = request.getParameter("id");
        User user = userService.findUserById(userId);
        return user.toString();  // user가 NULL이면 NullPointerException 발생
    }
}

변경 후

java
public class UserController {
    public String getUserById(HttpServletRequest request) {
        String userId = request.getParameter("id");
        User user = userService.findUserById(userId);
        if (user == null) {
            throw new UserNotFoundException("User not found for id: " + userId);
        }
        return user.toString();
    }
}

설명:

  • 변경 전: 호출된 findUserById 메서드가 NULL을 반환할 수 있으며, 그 경우 즉시 user.toString() 메서드가 호출되어 NullPointerException을 발생시킬 수 있습니다.
  • 변경 후: findUserById 메서드의 결과를 검사하여, user가 NULL인 경우 적절한 예외를 발생시키므로 NullPointerException을 방지할 수 있습니다.

관련 CVE

참조