XssPreventer.unescape 처리로 태그를 역치환하자!

lucy-xss-servlet-filter와 multipartFilter 적용 후 이슈가 발생했다.
CMS에서 Ckeditor를 통해 작성한 글에서 태그가 그대로 노출되는 현상을 발견하고, lucy-xss-servlet-filter-rule.xml의 url-rule-set 수정을 시도했으나 실패했다.
이후 XssPreventer.unescape를 이용한 특수문자 역치환 작업을 수행하여 문제를 해결했다.

 

 

 

✨시작하며

전자정부 프레임워크에서 프로젝트 수행 중 lucy-xss-servlet-filtermultipartFilter를 적용한 후, 다시 기능 개발을 하며 테스트 및 수행을 하고 있었다.

 

CMS에서 Ckeditor를 통해 글을 작성한 다음 Reservation Detail 페이지에서 태그가 그대로 노출되고 있으며 filter가 적용되고 있지 않는다는 이슈를 전달받아 이에 대한 분석을 시작했다.

 

 

 

url-rule-set

lucy-xss-servlet-filter-rule.xml에서 url-rule-set에 url-rule로 url을 지정해주면 해결이 될 것이라고 생각했다.


따라서 lucy가 와일드카드 기능을 지원하는지 직접 적용해보았으나 적용이 되지 않는 것 같아 검색을 해봤는데, 비슷한 케이스를 발견했다.
/ko/eduReservation이나 /ko/eduReservation/*처럼 적을 수 없고, /ko/eduReservation/detail.do처럼 반드시 모든 URL을 명시해줘야 한다고 적혀있었다.

 

그렇게 더 헛발짓하다 결국 역치환 방법을 찾아냈다.

 

 

 

XssPreventer.unescape

라이브러리 설치 당시에도 해당 영역에 예외 url을 등록해도 필터링에서는 제외가 되는데, 특수문자 치환에서는 제외되지 않는다고 한다.
참고한 블로그를 따라 예를 들면, /board/Add라는 주소로 데이터를 넣는 기능을 만들었을 때 해당 파라미터들은 컨트롤러에 도착할 때는 특수문자가 전부 치환되어 있는 상태라고 한다.

 

그렇기 때문에 나는 컨트롤러에서 add, edit 작업을 수행하기 전 직접 VO를 set, get을 통해 가져오고 지정해 역치환 작업을 수행하기로 했다.

 

eduReservationVO.setEduNotice(XssPreventer.unescape(eduReservationVO.getEduNotice()));

위와 같은 형태로 먼저 eduReservationVO에서 EduNotice라는 컬럼을 set으로 지정하도록 적어주고, XssPreventer.unescape를 통해 치환할 값을 getEduNotice로 가져온다.
이렇게 하면 역치환한 값을 set을 통해 EduNotice에 저장할 수 있다.
필요할 경우 getEduNotice() 뒤에 toString()을 붙이면 된다.

 

특수문자 역치환을 이렇게 하는 게 맞나 싶긴 하지만, 찾은 방법 대다수가 해당 방법을 채택하고 있었기에 나도 이렇게 작업해 프로젝트에 코드를 추가했다.

 

 

 

📜참고