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);
    }
}
