서블릿필터를 이용하여 파라메터값을 변경하였을 때 @ModelAttribute 어노테이션이 붙은 녀석들이 서블릿필터를 타기전의
파라메터 값으로 나오는군요.. xss, sql injection 처리부분을 servlet filter 를 써서 구현하던중...
ㅠ.ㅠ request.getParameter() 메소드를 이용하여 로그를 찍어보면 잘 나오구 있고...
마찬가지로 @RequesrParam 어노테이션을 붙였을 때에도 동일하게 서블릿필터를 타기전의 파라메터 값으로 나옵니다.
혹시 저처럼 애먹으신분 안계신가요?? 조언 좀 부탁드립니다.
참고로 spring 버전은 3.0 입니다.
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-
class>org.springframework.web.filter.CharacterEncodingFilter</filter-
class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>parameterFilter</filter-name>
<filter-class>com.xxx.filter.ParameterFilter</filter-class>
<init-param>
<param-name>configureFileName</param-name>
<param-value>parameterFilter.properties</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>parameterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
두개의 서블릿 필터가 등록 되어있습니다. 초기화 파라메터로 parameterFilter.properties 를 넘기는데 여기서
는 치환하지 말하야할 url 과 파라메터명들이 들어있어고 해당 url 의 해당 파라메터는 필터쪽에서 치환하지 않고 원본 파라메터
를 보내주도록 구현이 되어있습니다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/com/xxx/spring/root-context.xml</param-
value>
</context-param>
root-context.xml 의 내용은 요약하면 밑의 내용과 같구요.
<!-- Business Logic -->
<import resource="applicationContext-service.xml" />
<!-- Aspect (AOP) -->
<import resource="applicationContext-aspect.xml" />
또 디스패처쪽 설정은 밑에 처럼 되어있습니다.
<servlet>
<servlet-name>springDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</
servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/com/xxx/spring/servlet/dispatcher.xml</
param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
서블릿 필터의 doFilter 메소드에서는 HttpServletRequestWrapper 를 상속받아 구현한
requestWrapper 를 받아서
filterChain.doFilter(requestWrapper, response); 와 같이 넘겨 주고 있습니다.
getParameter(), getParameterValues(), getParameterMap() 메소드는 오버라이드 하여 치
환하도록 되어있습니다.
밑에는 getParameter() 메소드의 요약내용입니다. StringUtil.replaceHTMLTag() 요 넘이 치환하는
놈이구요. getParameterValues(), getParameterMap() 메소드도 거의 동일한 방식으로 구현되어있습니
다.
public String getParameter(String name) {
return StringUtil.replaceXss(super.getParameter(name));
}
request.getClass().getName() 을 찍어보면 제가 구현한 wrapperRequest 로 나오고 있고, 문제
는 jsp 부분과 컨트롤러쪽에서 request.getParameter(), getParameterValues(),
getParameterMap() 메소드를 호출한 경우 치환된 값이 잘 나오는데...
컨트롤러쪽 메소드에서 @ModelAttribute, @RequesrParam 를 썼을 경우, 치환전의 값으로 나오고 있다는 겁니
다 ㅠ.ㅠ
스프링쪽에서 parameter 값들을 @ModelAttribute, @RequesrParam 에 넣어줄 때 치환되기전의 원본
request 로 하고있는걸까요? 아니면 requestWrapper 부분에서 request 를 파싱하는 부분을 다시 만들어야하는
걸까요...
--