특정 문자 변경하는 Filter 만들기

작성: 2021.06.02

수정: 2021.06.02

읽는시간: 00 분

Programming/JPA ⁄ Spring

반응형

제가 지금 준비중인 Project에서는 Markdown 문법을 지원하고 있습니다.

그런데 xss 방어용으로 등록한 lucy-xss-servlet-filter가  > 를 일괄적으로 > 로 변경해버리는 바람에 markdown 에서 많이 쓰는 문자중 하나인 '>'를 사용하지 못하는 상황이 되어 버렸습니다.

 lucy-xss-servlet-filter 에서 특정 문자를 제외하는 방법을 엄청 찾아봤는데 그건 없어서..

Custom Filter를 하나 더 추가 해서 Lucy 필터 다음에 위치하도록 하고, >를 모두 >로 변경하도록 해 보았습니다.

CustomWrapper를 먼저 만듭니다.

package best.gaia.utils.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public final class GtCustomWrapper extends HttpServletRequestWrapper {
 
 public GtCustomWrapper(HttpServletRequest servletRequest){
  super(servletRequest);
 }
 
 public String[] getParameterValues(String parameter){
  
  String[] values = super.getParameterValues(parameter);
  
  if(values == null){
   return null;
  }
  int count = values.length;
  
  String[] encodedValues = new String[count];
  for(int i = 0; i < count; i++){
   encodedValues[i] = XssFilterMethod(values[i]);
  }
  
  return encodedValues;
 }
 
 public String getParameter(String parameter){
  String value = super.getParameter(parameter);
  if(value == null){
   return null;
  }
  return XssFilterMethod(value);
 }
 
 public String getHeader(String name){
  String value = super.getHeader(name);
  if(value == null){
   return null;
  }
  return XssFilterMethod(value);
 }
 
 private String XssFilterMethod(String value){
  
  value = value.replaceAll("&gt;",">");
  
  return value;
 }
}



 

이제 필터에서 해당 Wrapper로 Wrapping을 시킵니다.

package best.gaia.utils.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class GtCustomFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		chain.doFilter(new GtCustomWrapper((HttpServletRequest)request), response);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

 

마지막으로 web.xml에 Lucy 필터 다음 자리에 필터를 추가합니다.

	
	<filter>
		<filter-name>xssEscapeServletFilter</filter-name>
		<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
	</filter>
	<filter-mapping>
	    <filter-name>xssEscapeServletFilter</filter-name>
	    <url-pattern>/*</url-pattern>
	</filter-mapping>
	
<!-- 	luch의 xss 방어를 방어하는 커스텀 필터 ( ">" 방어 되돌리기 ) -->
	<filter>
		<filter-name>GtCustomFilter</filter-name>
		<filter-class>best.gaia.utils.filter.GtCustomFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>GtCustomFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

이렇게 하니 이제 더이상 > 가 필터링 되지 않아 마크다운 쓰는데 문제가 없었습니다!


문제 해결은 되었지만,  두번 파싱하니 좋은 방법은 아니라서 해본것에 의의를 두고 Discard 시켰습니다..

lucy-xss-servlet-filter-rule.xml 에 url 이나 parameter를 예외로 등록 하고 사용 하면 되지만, 그 경우에는 또 해당 구역에 보안 취약점이 생기게 됩니다.

결국에는 위의 방법으로 하거나 xss 필터를 뜯어 고쳐서 사용 하는 방법 밖에 없습니다. 이상입니다.

 

 

반응형