XSS Filter 사용시 , request parameter에 대한 처리는 되어도 ,
Raw Body에 대한 처리는 안되기 때문에, 다양한 방법으로 처리 함을 볼수 있다.
HomoEfficio 님의 Spring에서 JSON에 XSS 방지 처리 하기 와 같이
raw Body에 대한 처리를 못하는 lucy-xss-servlet-filter 를 대신하여.
MessageConverter에서 Response 작성시 처리하는 로직을 추가하거나 하는 방법이 있다.
방법들에 대한 생각.
- RequestWrapper 작성하여, Custom filter에서 inputStream 에 대한 Xss filter 처리
- 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가 아니라고 생각하기 때문에 언제라도 해당 글을 삭제할 생각이 있습니다.
(다른 개발자들이 , 구글링 했을때 높은 수준의 참고자료가 검색되길 원하기 때문입니다. 꾸벅)