Programming/Error

lucy-xss-servlet-filter 적용하며 발생한 오늘의 오류, & 그리고 &amp

Jan92 2021. 8. 5. 00:37
반응형

lucy-xss-servlet-filter를 적용하며 발생했던 오류 기록

 

 

lucy-xss-servlet-filter를 알기 전 먼저 XSS 크로스 사이트 스크립팅 공격의 개념에 대해서 알아보겠습니다.

 

XSS (Cross Stie Script), 크로스 사이트 스크립팅 공격

XSS는 웹 어플리케이션의 게시글 같은 곳에서 공격자가 악의적으로 스크립트를 삽입해 공격하는 기법입니다. 

이 공격은 사용자(클라이언트)를 대상으로 이뤄지며, 웹의 게시판 같은 곳에서 데이터를 서버로 저장할 때 데이터에 대한 검증이 이뤄지지 않거나 xss에 대한 방어 대비가 없다면 스크립트가 포함된 데이터가 저장되어 사용자가 해당 글을 클릭했을 때 스크립트가 실행되어 유저의 개인정보 및 데이터를 탈취하는 상황이 발생합니다.

 

그리고 이러한 공격을 막기 위한 방법이 네이버에서 개발한 XSS 필터링 기법인 lucy-xss-servlet-filter입니다.

(루시 필터는 현재 만들고 있는 웹사이트에도 적용이 필요하고, 좀 더 자세하게 알아보고 싶어서 따로 공부하여 다시 포스팅할 예정입니다.)

 

& 치환
->
&amp
< &lt
> &gt
' &#x27
" &quot

 

<script>alert("lusy test")<script>
&lt;script&gt;alert(&quot;lusy test&puot;&lt;/script&gt;

 

필터를 적용하며 발생한 오류는 다음과 같습니다.

회원가입 password 부분에서 영문, 숫자, 특수문자가 포함된 값을 입력하도록 정규식을 사용하고 있었습니다.

잘못된 값이 들어오는 것을 이중으로 막기 위해 프론트엔드, 백엔드 각각 동일한 정규식을 사용하고 있었습니다.

그런데 '&' 문자가 프론트엔드에서는 넘어오는데 백엔드 Request 부분에서 @Valid 어노테이션에 걸려 에러 메세지가 출력되었습니다.

 

처음에는 루시 필터 때문이라고 전혀 생각을 못하고 정규식이 잘못되었나 싶어서 자바 내부에서도 테스트를 해보고, 외부 정규식 체크 사이트를 통해서도 테스트를 해봤지만 정규식은 이상이 없었습니다.

 

그러가다 생각난 것이 얼마 전에 적용한 루시 필터였고, 필요한 부분만 적용시킨 것이 아닌 전체 포인트에 모두 적용한 것이 오류를 불렀습니다.

사용자로부터 입력된 '&' 문자가 프론트를 통과하고 백엔드에 들어오면서 lucy-xss-servlet-filter에 걸려 &amp;라는 값으로 변환되었고, 특수문자에 적용하지 않고 있던 ';' 때문에 @Valid에 걸려 에러 메세지가 출력된 것이었습니다.

 

 

해결 방안은 루시 필터를 제거하고 필요한 부분에 HtmlUtils.htmlEscape를 사용하는 것으로 결론이 났고, 다행인 것은 실서버에 아직 필터가 적용되어 들어간 데이터가 없었기 때문에 크게 문제가 발생하지는 않았습니다.

 

 

오늘 오류를 겪으며 우선 정규식 regex에 대한 공부의 필요성을 느꼈습니다. 기존에 구글링을 통해 정규식을 가져와서 쓰기 바빠 적확한 정규식 포맷을 이해하지 못하고 있던 것이 아쉬웠습니다.

그리고 Java 내부에서 Test를 사용할 수 있었다면 바로 테스트를 해 볼 수 있었을 것인데 Test를 사용하는 것에 대한 요청에서 아직 기능을 사용할 줄 모른다는 대답을 할 수밖에 없었다는 것이 아쉬웠습니다.

Test는 원래도 공부하고 싶었던 부분이니만큼 조금씩이라도 꾸준히 공부해야겠다는 생각을 했습니다.

반응형