스프링의 @Component
, @Controller
, @Service
그리고 @Repository
클래스들은 기본적으로 애플리케이션에서 하나만 인스턴스화 되는 싱글톤 객체입니다.
일반적으로 이러한 클래스들은 logger
와 같은 적은 수의 static
멤버 변수들을 가질 수 있지만, 모든 non-static
멤버 변수들은 스프링에 의해 관리되어야 합니다.
즉, 이러한 변수들은 @Resource
, @Inject
, @Autowired
@Value
와 같은 종류의 어노테이션이 달려있어야 합니다.
이러한 클래스들에 주입되지 않은 멤버 변수를 가지는 것은 상태를 변경하려는 시도를 나타낼 수 있습니다. 그들은 싱글톤 객체이기에, 상태를 변경하는 시도는 결국 User1 의 세션에서 User2 로 데이터를 노출하는 것을 보장합니다.
이 규칙은 @ConfigurationProperties
로 어노테이션되지 않은 싱글턴 객체인 @Component
, @Controller
, @Service
또는 @Repository
클래스가
아래의 어노테이션이 달리지 않은non-static
멤버를 가질 때 문제를 제기합니다.
- org.springframework.beans.factory.annotation.Autowired
- org.springframework.beans.factory.annotation.Value
- javax.annotation.Inject
- javax.annotation.Resource
규칙을 어긴 코드
@Controller
public class HelloWorld {
private String name = null;
@RequestMapping("/greet", method = GET)
public String greet(String greetee) {
if (greetee != null) {
this.name = greetee;
}
return "Hello " + this.name; // greetee 가 null 인 경우, 이전 사용자의 데이터가 표시됩니다.
}
}
참고
- OWASP Top 10 2017 Category A3 - Sensitive Data Exposure
If you like SONARKUBE, don’t forget to give me a star.