package egovframework.com.cmm; import java.util.Enumeration; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import egovframework.com.cmm.util.EgovXSSUtil; public class InterceptorHandler extends HandlerInterceptorAdapter{ private static final Pattern SQL_PATTERN = Pattern.compile( "(?i)(select|insert|delete|update|create|drop|alter|where|substr|substring|group by|union|xp_cmdshell|and|or|having|from|unio|case|when|if|--|;|/\\*|\\*/|\\bor\\b|\\band\\b)" ); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { /** * URL 호출 전 넘어오는 파라미터 체크 * request로 넘어오는 모든 파라미터 데이터를 검사하여 XSS 문자가 포함되어 있으면 메인화면으로 튕김 * */ boolean returnSts1 = true; Enumeration e = request.getParameterNames(); while ( e.hasMoreElements() ){ String name = (String) e.nextElement(); { //XSS 보안조치 if(name.toLowerCase().contains("cmplntreqcn") || name.toLowerCase().contains("autcn") || name.toLowerCase().contains("file_0") || name.toLowerCase().contains("file_1") || name.toLowerCase().contains("seccn") || name.toLowerCase().contains("nttcn") ) { String[] values = request.getParameterValues(name); for (String value : values) { boolean returnSts = EgovXSSUtil.cleanXSS(value); if(!returnSts) {//XSS 문자 체크 결과 false일 경우 메인화면으로 이동 returnSts1 = returnSts; System.out.println("+++++++++++++++++++++++++++XSS 필터 처리 Filter::: "); System.out.println("name="+ name + ", value="+ value); System.out.println("+++++++++++++++++++++++++++XSS 필터 처리 Filter End::: "); response.sendRedirect(request.getContextPath() + "/"); } } } } { //SQL Injection 보안조치 if(name.toLowerCase().contains("searchsortcnd") || name.toLowerCase().contains("searchsortord") ) { //파라미터 중에 URL 주소를 넘겨주는 부분이 있어서 해당 부분에것 select~, update~, delete~ 로 시작하는 주소경로가 있어서 제외처리를 하였음 String[] values = request.getParameterValues(name); for (String value : values) { if (value != null && SQL_PATTERN.matcher(value.toLowerCase()).find()) { System.out.println("+++++++++++++++++++++++++++XSS Html 필터 처리 Filter Start::: "); System.out.println("name="+ name + ", value="+ value); System.out.println("+++++++++++++++++++++++++++XSS Html 필터 처리 Filter End::: "); response.sendRedirect(request.getContextPath() + "/"); } } } } } if(!returnSts1) {//XSS 포함문자가 있는경우 메인화면으로 이동시킨다. response.sendRedirect(request.getContextPath() + "/"); return true; } return true; } /* * view 화면으로 데이터가 넘어가기 이전에 실행 * modelAndView 값을 체크할 수 있음 * */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); } /* * * view에서 모든 처리를 완료한 후에 실행 * */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { super.afterCompletion(request, response, handler, ex); } }