Spring Boot , Jackson Json Xss 처리

XSS Filter 사용시 , request parameter에 대한 처리는 되어도 ,

Raw Body에 대한 처리는 안되기 때문에, 다양한 방법으로 처리 함을 볼수 있다.

HomoEfficio 님의 Spring에서 JSON에 XSS 방지 처리 하기 와 같이

raw Body에 대한 처리를 못하는 lucy-xss-servlet-filter 를 대신하여.

MessageConverter에서 Response 작성시 처리하는 로직을 추가하거나 하는 방법이 있다.

방법들에 대한 생각.

  1. RequestWrapper 작성하여, Custom filter에서 inputStream 에 대한 Xss filter 처리
  2. HomoEfficio 님과 같이 MessageConverter 를 이용한 response 작성 시 Xss filter하여 보여주기

나는 3번을 생각해보았다.

3. Jackson2ObjectMapperBuilderCustomizer 를 이용한 String Type에 대한 deserializerByType 메소드 작성하여, Xss filter 처리 하여 저장.

왜 나는 3번의 방법을 생각했을까 ..

  • 현재 내가 작성하는 어플리케이션은 Rest기반의 json통신으로 데이터가 생성되고 수정된다.
  • 일반적인 form과 파라미터에 대해서는 따로 다른 XSS 필터를 적용할것이다.
  • multipart 를 통한 데이터 전달시에도 처리 되어야 한다.
  • 모든 Request json데이터는 @RequestBody 나 @RequestPart 를 통해 모델과 맵핑된다.
  • 맵핑시 현재 SpringBoot에서 기본으로 사용하는 Jackson이 사용된다.
  • 교차 사이트 스크립트가 들어가는 String Property에만 적용되어지면 된다. (입력한 원본문자열이 변경되어 저장되어도 괜찮다는 전제조건)
  • 매번 Response 작성시 보다는 Request 입력시 처리하는 것이 XSS 처리 횟수가 더 적을 것으로 보인다.
  • 기존 application.properties 의 jackson 설정에 영향이 가서는 안된다.
    때문에 Jackson2ObjectMapperBuilderCustomizer 를 사용.

Spring Boot Document — 74.3 Customize the Jackson ObjectMapper
( 참고 : 스프링 부트에서 Jackson을 커스터마이즈 하는 방법에 대한 문서)

xss 자열 filter 를 하기 위해 naver lucy를 써도 되고 다른 xss filter util을 써도 된다.

* 문제점

xml이나 다른 raw body 요청에 대한 처리는 안된다.

오로직 json.. 전체적인 처리를 위해선 input stream을 처리해야하는것으로 보이는데. 불필요한 부분에 처리로직이 포함될까봐. 걱정이되어 json만.

  • 추가 (2017.07.04)

방법 3–1:
Json에 대해서만 처리한다는 것은 동일.
parsing 대상 필드에 @JsonDeserialzer 적용하여 , 대상 필드만 xss필터 하는 deserialzer를 사용하도록 하는 방법

JsonDeserialzer를 상속 받는 클래스를 작성하자

SampleDTO.class의 대상 필드에 어노테이션을 아래와 같이 적용.

Json -> JsonDeserializer(XssStringDeserializer.class) -> name variable
흐름으로 특정필드에 대해서만 CustomDeserializer를 적용할수 있다.

추가 2020–09–22
방법 3–2:
Json String Deserializer 를 확장하고 기본적으로 역직렬화시에 모두 문자열을 이스케이프 한다.
ContextualDeserialzer로 필드의 xss ignore 어노테이션을 확인하여 적절한 StringDeserializer를 할당한다.

!! Best Practice가 아니라고 생각하기 때문에 언제라도 해당 글을 삭제할 생각이 있습니다.
(다른 개발자들이 , 구글링 했을때 높은 수준의 참고자료가 검색되길 원하기 때문입니다. 꾸벅)

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store