본문 바로가기

Web/웹 상식

[Spring] @InitBinder에 대해서

최근에 Spring 관련해서 보안 이슈가 하나 있었습니다. JDK 9 버전 이상의 모든 Spring Core에서 원격 코드 실행이 가능한 0-Day Exploit의 취약점이 알려졌습니다. 그리고 패치 이전에 공격코드가 이미 알려진 상태였습니다.

 

https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/

 

Spring4Shell: Security Analysis of the latest Java RCE '0-day' vulnerabilities in Spring | LunaSec

We've been taking a look at the new zero-day exploit, dubbed Spring4Shell, supposedly discovered in Spring Core to determine if it's a problem or not, as well as explained another RCE vulnerability found in Spring.

www.lunasec.io

 

이에 대해 임시적인 조치를 취하던 와중에 @InitBinder라는 어노테이션을 부끄럽지만 처음 보게 되었습니다.

그래서 간단하게 정리하고자 합니다.

 

InitBinder

  • Controller로 인입되는 요청에 대해 추가적인 설정을 할 수 있게 해 준다.
  • 속한 Controller의 모든 요청 전에 InitBinder를 선언한 메서드가 실행된다.

 

사용법

@Controller
public class TestController {
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
    	webDataBinder.setDisallowedFields("test");
        
        webDataBinder.setAllowedFields("test");
        
        webDataBinder.addCustomFormatter();
        
        webDataBinder.registerCustomEditor(String.class, customStringEditor);
        
        webDataBinder.addValidators(new TestValidater());
    }

}

// @ControllerAdvice에도 사용 가능하다
@ControllerAdvice
public class TestControllerAdvice {

    // 특정 객체에만 적용할 때
    @InitBinder("String")
    public void initBinder(WebDataBinder webDataBinder) {
    	...
    }
}
  • WebDataBinder
    • 요청 매개변수를 모델 객체에 바인딩하는 역할
  • setDisallowedFields("test")
    • 객체의 프로퍼티 중 test라는 필드가 있는 경우 적용된다.
    • 해당 필드가 값이 설정되어 인입되는 것이 원치 않을 경우 사용하고 해당 값이 없도록 처리된다.
  • setAllowedFields("test")
    • 허용할 필드를 지정하여 해당 값들만 허용한다.
  • addCustomFormatter()
    • 사용자 지정 Formatter를 등록할 수 있다.
  • registerCustomEditor()
    • 사용자 지정 CustomEditor를 등록할 수 있다.
  • addValidators()
    • Validator를 등록할 수 있다.
반응형