본문 바로가기

[Terry] JAVA

java.util.regex.PatternSyntaxException: Unclosed group near index 1

테스트 서버 가지고 뻘짓을 하던중 다음과 같은 exception이 발생했다.

java.util.regex.PatternSyntaxException: Unclosed group near index 1
(
 ^
        at java.util.regex.Pattern.error(Pattern.java:1541)
        at java.util.regex.Pattern.accept(Pattern.java:1399)
        at java.util.regex.Pattern.group0(Pattern.java:2313)
        at java.util.regex.Pattern.sequence(Pattern.java:1586)
        at java.util.regex.Pattern.expr(Pattern.java:1558)
        at java.util.regex.Pattern.compile(Pattern.java:1291)
        at java.util.regex.Pattern.<init>(Pattern.java:1047)
        at java.util.regex.Pattern.compile(Pattern.java:808)
        at eluon.xroshot.util.StringUtil.replaceIgnoreCase(StringUtil.java:321)
        at eluon.xroshot.util.StringUtil.xssFilter(StringUtil.java:332)
        at eluon.xroshot.action.sms.SendStep1Controller.process(SendStep1Controller.java:80)
        at eluon.xroshot.action.BaseController.handleRequestInternal(BaseController.java:514)
        at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.ja
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:354)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:126)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
        at com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:77)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
        at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
        at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:127)
        at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
        at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
        at com.caucho.server.http.Invocation.service(Invocation.java:315)
        at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
        at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:253)
        at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:170)
        at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
        at java.lang.Thread.run(Thread.java:534)

PatternSyntaxException이라... 네이놈에게 물어본 결과 이 녀석은 정규식에서 문법적 에러를 나타내는 unchecked exception이라고 한다. 먼말인지...ㅡㅡ;;;
그래서 일단 프레임워크 쪽 문제라고  보기 힘들어서 우리 소스에서 처음 문제가 발생한 소스로 이동했다.
해당 메소드를 확인해보니, Cross-Site Scripting에 대비해서 문자코드를 변경하는 코드였다.
그렇다면 문자코드를 변환하면서 문제가 발생했다고 유추할수 있었다.
그래서 일단 api에서 에러가 발생하는 exception에 대해 찿아보았다.
(확인해보니 이 패키지는 1.4버전부터 지원된 것이었다. ㅡ,.ㅡ;;)

확인하니 역시 정규식 패턴에 문법 에러를 나타낸다고 한다. (이건 네이놈이랑 같자나....)
그래서 패턴에 java.util.regex.Pattern을 확인해 보니
"(" , ")"을 처리할 경우에는 \\를 앞에 붙여 줘야 한다고 한다.

그래서 해당하는 함수 xssFilter()에 있는 replaceIgnoreCase()에서 "(" 과 ")"을 변화하는 부분에서 앞에 \\를 붙여 주었더니 정상적으로 동작햇다.







참고.
만약에 패턴을 이용하는 방식을 사용하기 힘들다면, substring()과 indexof를 이용해 새로 함수를 만들어 사용하는 방안을 모색해야 한다.