안규 공부방

security > 모든 사용자 입력값을 체크하는 Function

등록일 : 2017-06-30 14:43 조회수 : 94,058

이번내용은 http://www.taeyo.pe.kr/ 홈페이지에서 발췌한 자료임을 알려드립니다.    
요즘 Sql Injection 공격으로 인해 많은 서버 관리자및 개발자들이 고생을 많이 하고 있습니다.
아래 소스는 이런 공격에 대한 차단을 해 주는 소스 입니다.

데이타 베이스 테이블

CREATE TABLE [dbo].[hacking_log](
[board_idx] [int] IDENTITY(1,1) NOT NULL,
[hl_date] [datetime] NULL,
[hl_ip] [varchar](100) COLLATE Korean_Wansung_CI_AS NULL,
[hl_page] [varchar](100) COLLATE Korean_Wansung_CI_AS NULL,
[hl_text] [varchar](2000) COLLATE Korean_Wansung_CI_AS NULL
) ON [PRIMARY]
ASP 소스 코드

TmpHackString = Split("insert,update,select,delete,drop,--,char,exec",",")

strcon="Provider=SQLOLEDB;User ID=sa;Password=;Data Source=서버 아이피;Initial Catalog=연결디비;"
Set objCnn = Server.CreateObject("ADODB.Connection") 
objCnn.Open strcon 

Function CheckRequestValue(byVal c_value)
	tmpValue = trim(Lcase(c_value))
	for TmpLoopi = lbound(TmpHackString) to ubound(TmpHackString)
	
		if InStr(tmpValue,TmpHackString(TmpLoopi)) > 0 then 
			' 해킹 경고 메시지	
			tmp_HackLog = "의심 문자 : " & TmpHackString(TmpLoopi) & "<br>"

			For each Query_Item in Request.QueryString
				For i = 1 to Request.QueryString(Query_Item).Count
				  tmp_HackLog = tmp_HackLog & "Request.QueryString(" & Query_Item & ")(" & i & ") = " & Request.QueryString(Query_Item)(i) & "<br>"
				Next
			Next
 
			For each Query_Item in Request.Form
				For i = 1 to Request.Form(Query_Item).Count
				  tmp_HackLog = tmp_HackLog & "Request.Form(" & Query_Item & ")(" & i & ") = " & Request.Form(Query_Item)(i) & "<br>"
				Next
			Next
 

			strSql = " Insert Into hacking_log (hl_date,hl_ip,hl_page,hl_text) values (getdate(),'"&Request.ServerVariables("REMOTE_ADDR")&"'" &_
				 " ,'"&Request.ServerVariables("URL")&"','"&tmp_HackLog&"') "
			set objRs=objCnn.Execute(strSql)
		
			p_html = "접근제한 -- SQL 인젝션으로 판단되어 접근을 제한합니다.(insert,update,select,delete,drop,--) 등등"

			response.Write(p_html)         
			response.end
		end if
	Next
End Function 

For each Query_Item in Request.QueryString
	For i = 1 to Request.QueryString(Query_Item).Count
		Call CheckRequestValue(Request.QueryString(Query_Item)(i))
	Next
Next

For each Query_Item in Request.Form
	For i = 1 to Request.Form(Query_Item).Count
		Call CheckRequestValue(Request.Form(Query_Item)(i))
	Next
Next
넘어오는 QueryString 값을 비교하여 TmpHackString 에 정의한 문자가 존재하면 접근을 제한하는 소스입니다.

위 소스는 헛점이 너무 많아서 저도 사용을 하지 않고 있습니다. 이런방법이 있다는 정도만 알고 계시면 될거 같습니다.
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.