본문 바로가기

db

SQL Injection Blocking

참고사이트 : http://forums.asp.net/t/1254125.aspx


Global.asax의 Application_BeginRequest 메서드를 이용하여 모든 요청에 대하여 필터링 하는 예제 코드입니다.

//연장준비 네임스페이스 추가
using System.Globalization;

//Get, Post, Cookie까지 모두 필터링
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    foreach (string key in Request.QueryString)
       CheckInput(Request.QueryString[key], key);
    foreach (string key in Request.Form)
       CheckInput(Request.Form[key], key);
    foreach (string key in Request.Cookies)
       CheckInput(Request.Cookies[key].Value, key);  
}

//필터링 할 문자열
public static string[] blackList = {"--",";--",";","/*","*/","@@",
              "declare","delete","update","insert", "select",
              "exec", "execute",
              "drop","kill","sysobjects","syscolumns"};

//필터링 제외할 페이지
public static string[] nochkPageList = {"nochk1.aspx", "nochk2.aspx","nochk3.aspx"};

//필터링 제외할 파라메터 KEY값
public static string[] nochkParamList = {"userid","useremail"};

private void CheckInput(string parameterValue, string parameterName)
{
      CompareInfo comparer = CultureInfo.InvariantCulture.CompareInfo;

      bool chk = true;
      for (int j = 0; j < nochkParamList.Length; j++)
      {
           if (parameterName.ToLower() == nochkParamList[j].ToLower())
           {
              chk = false;
           }
      }

      for (int k = 0; k < nochkPageList.Length; k++)
      {
           if (comparer.IndexOf(Request.RawUrl.ToString(),nochkPageList[k],CompareOptions.IgnoreCase) >= 0)
           {
               chk = false;
           }
       }
   
       for (int i = 0; i < blackList.Length; i++)
       {
           if (comparer.IndexOf(parameterValue,blackList[i],CompareOptions.IgnoreCase) >= 0 && chk == true)
           {
                try
                {
                      //Log남기기
                }
                catch{}
                finally
                {
                      Response.Redirect("/Exception.aspx");
                }
           }
      }
}

위 소스에 문제점은 blackList에 정의된 단어가 입력되면 무조건 Exception페이지로 보내버리게 된다.
가령 아이디가 declare라는 고객이있다면 혹은 게시판 제목을 update post라고 작성한다면...
그런 문제점으로 인하여 추가한게 nochkPageList와 nochkParamList이다.
정의된 페이지와 파라메터key값일때는 필터링 하지 않겠다는거다.

여기서 또 문제점은... 기껏 Sql Injection공격을 막는다고 해놓고 필터링 예외페이지와 예외 파라메터라고 정의해놓으면 예외로 지정된 페이지와 파라메터를 타고 공격이 들어온다면 속수무책으로 당할 수 밖에 없다.

그럼 어떻게 하면 보다 완벽한 소스로 구현할 수 있을까?

내일로 미루고... =_=;


'db' 카테고리의 다른 글

READPAST 그리고 WITH(NOLOCK)  (0) 2009.12.19
커서(CURSOR)를 TABLE변수로 변경  (1) 2008.12.29
Mass SQL Injection 공격  (0) 2008.11.04