하늘높이의 프로그래밍 이야기

SQL Injection 처리 이 글을 작성한 지 한 일주일 정도가 흘렀는데…

블로그에 이 키워드로 방문하시는 분이 꽤 많으신 듯…

 

해당 키워드를 다시 찾아보니…

구글에 찾아보니 검색된 사이트가 28300여 개로 늘었다. (허걱 4배나…)

 

구글 검색

 

음 “빵빵용용”님의 새 글(http://saybox.tistory.com/546 )을 읽어 보면 이 공격의 원인도 보이고 해결 방법도 보인다.

 

하지만…

Request 를 받는 모든 소스를 수정한다는 것은…만만한 작업은 아니더라...

지금 사이트도 Request를 검색해보니 4~500개

하지만 이 사이트는 1년에 글 한 개 올라오기 힘든 회사 소개 홈페이지 인데…

그것을 위해 게시판 소스를 다 뒤집자니 시간이 아깝고… 검색된 리퀘스트 문장은 4~500개에 가깝고…

 

그래서 어떻게 편하게 할까 고민해 봤다.

그리고 생각해 난 방법이

이렇게 커넥션 문장 아래에… GET과 POST를 모두 조사해서 DB 문장이 들어오면 에러메시지를 뿌리고 Response.end !!

(사이트 성격에 따라 이렇게 처리해도 무관한 사이트도 있을 것 같아서 올려 봅니다. 참고하세요.!~)

<% 
    Set pConn = Server.CreateObject("ADODB.Connection")

sConnStr = "Provider=SQLOLEDB.1;User ID=" & DB_user_id &

";password=" & DB_user_pass & ";Initial Catalog=" & DB_name &

";Data Source=" & DB_server_name

    pConn.Open sConnStr
    
    	Function DBStringCheck(strRequest,strCompare)
	    if instr(Lcase(strRequest),strCompare) > 0 then

response.Write("오류:입력되지 않아야 할 특수 문자[" &

strCompare &"] 입니다.<BR>관리자에게 문의 바랍니다.")

	    	response.end
	    end if
	End Function
	
	For Each item1 in Request.QueryString
		'//차단할 단어를 입력
		call DBStringCheck(Request.QueryString(item1),chr(39))
		call DBStringCheck(Request.QueryString(item1),"exec")
		call DBStringCheck(Request.QueryString(item1),"select")
		call DBStringCheck(Request.QueryString(item1),"xp_")
		call DBStringCheck(Request.QueryString(item1),"char")
		call DBStringCheck(Request.QueryString(item1),";")

	Next
	For Each item1 in Request.Form
		'//차단할 단어를 입력
		call DBStringCheck(Request.Form(item1),chr(39))
		call DBStringCheck(Request.Form(item1),"exec")
		call DBStringCheck(Request.Form(item1),"select")
		call DBStringCheck(Request.Form(item1),"xp_")
		call DBStringCheck(Request.Form(item1),"char")
          	call DBStringCheck(Request.Form(item1),";")

	Next	 
%>