임베디드아로마

SQL Injection 방지 / HTML Tag 방지처리 (basepage) 본문

Experience

SQL Injection 방지 / HTML Tag 방지처리 (basepage)

aromacrony 2017. 4. 23. 23:50

basepage내에 해당 코드 삽입

        #region :Page_Init Event
       
        /// <summary>
        /// 서비스명    : Page_Init 이벤트 메서드.
        /// 서비스내용    : 페이지로딩시 초기화 작업을 수행하는 이벤트 메서드 입니다.
        /// </summary>
        private void Page_Init(object sender, System.EventArgs e)
        {
            _pageUtility    = new AppPageUtility(this);
            _typeUtility    = new AppTypeUtility();
            _log            = new AppLog();
            _bwm            = new AppBWM();
            _portalUser        = new AppPortalUser();

            ////////////////////////////////////////////////////////////
            ///QueryString 과 form 내에 불법적인코드가 삽입되었는지 확인
            ////////////////////////////////////////////////////////////
            this.CheckQueryString(Request);

        }

        #endregion




        #region :SQL Injection 방지 / HTML Tag 방지처리

        /// <summary>
        /// 서비스명    : CheckQueryString 메서드.
        /// 서비스내용  : QuertString 을 체크한 후 잘못되었으면 페이지를 표시하지 않습니다.
        /// </summary>
        /// <param name="QueryString">QueryString 컬렉션입니다.</param>
        //public void CheckQueryString(System.Collections.Specialized.NameValueCollection queryString)
        protected void CheckQueryString(HttpRequest poRequest)
        {
            System.Collections.Specialized.NameValueCollection queryString  = poRequest.QueryString;
            System.Collections.Specialized.NameValueCollection formString   = poRequest.Form;
   
            bool bCheck = true;
//            string sMessage = "";
            string[] allRequest;

            // QueryString 체크
            // HTTP 쿼리 문자열 변수의 컬렉션을 가져옵니다.
            allRequest = queryString.AllKeys;

            for (int i=0; i < allRequest.Length; i++)
            {
                if (!this.CheckCharacter(queryString.GetValues(allRequest[i])))
                {
                    bCheck = false;
                    break;
                }
            }

            if (!bCheck)
            {
                HttpContext.Current.Response.End();
            }
            bCheck = true;

            // Form 체크
            // HTTP 요청의 컨텐트 형식이 application/x-www-form-urlencoded 또는 multipart/form-data인 경우에만 채워집니다.
            allRequest = formString.AllKeys;

            for (int i=0; i < allRequest.Length; i++)
            {
                if (!this.CheckCharacter(formString.GetValues(allRequest[i])))
                {
                    bCheck = false;
                    break;
                }
            }

            if (!bCheck)
            {
                HttpContext.Current.Response.End();
            }
        }

        protected bool CheckCharacter(string[] psCheck)
        {
            foreach(string sCheck in psCheck)
            {
                if (!this.CheckCharacter(sCheck)) return false;
            }

            return true;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="psCheck"></param>
        /// <returns></returns>
        protected bool CheckCharacter(string psCheck)
        {
            string[] sCheckCharacter = new string[]{"<","'","--","/*","*/"};
     
            foreach(string sTemp in sCheckCharacter)
            {
                int     iTemp = -1;
                string  sCheck = psCheck;

                iTemp = sCheck.IndexOf(sTemp.ToUpper());
       
                if(iTemp != -1)
                {
                    string sMsg  ="[ "+ sTemp + " ]는 해킹방지를 위하여 허용되지 않는 문자입니다.\n" ;
                           sMsg +=" 사용하신 문자가[']이신 경우는 데스크탑 키보드기준으로 왼쪽 Tab 키 위에 있는[`]로 대체 사용가능합니다";
           
                    PageUtility.AlertMessage(sMsg,true,false,"history.back();");
                                        
                    return false;
                }
            }

            return true;
        }

        #endregion


Comments