반응형
제가 지금 준비중인 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(">",">");
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 필터를 뜯어 고쳐서 사용 하는 방법 밖에 없습니다. 이상입니다.
반응형