SQL injection 웹에서 체크하기
Asp구문입니다.
디비 커넥 인클루드 이전에 넘어오는 모든 변수들을 한번 체킹하면 될까 해서 만들어 봤습니다.
방심하고 있는새에 저도 당했습니다. ㅜ.ㅜ
<%
InJec_FormStr = URLDecode(Request.Form)
InJec_QueryStr = URLDecode(Request.querystring)
Befor_ParaChk(InJec_QueryStr)
Befor_ParaChk(InJec_FormStr)
Function Befor_ParaChk(Request_Str)
Request_Str_Arry = Split(Request_Str,"&")
Request_Str_Len = Ubound(Request_Str_Arry)
For i = 0 To Request_Str_Len
Request_Val_Arry = Split(Request_Str_Arry(i),"=")
Request_Chk_Val = Request_Val_Arry(1)
Request_Chk_Val = Befor_Replacer(Request_Chk_Val)
Next
End Function
Function Befor_Replacer(ParaName)
ReturnStr = ""
IF IsNumeric(Trim(ParaName)) = True Then
IF SGN(Trim(ParaName)) = -1 Then
Response.Write "<script>"
Response.Write "alert ('음수를 사용하실 수 없습니다. ! ' ) ;"
Response.Write "history.back(-1);"
Response.Write "</script>"
Response.end
Else
ReturnStr = ParaName
End IF
Else
ChkStr = 0
'금지어체크
IF Instr(LCase(ParaName), "select") > 0 Then ChkStr = 1 End IF
IF Instr(LCase(ParaName),"insert") > 0 Then ChkStr = 2 End IF
IF Instr(LCase(ParaName), "count(") > 0 Then ChkStr = 3 End IF
IF Instr(LCase(ParaName), "drop") > 0 Then ChkStr = 4 End IF
IF Instr(LCase(ParaName), "update") > 0 Then ChkStr = 5 End IF
IF Instr(LCase(ParaName), "truncate") > 0 Then ChkStr = 6 End IF
IF Instr(LCase(ParaName), "asc(") > 0 Then ChkStr = 7 End IF
IF Instr(LCase(ParaName), "mid(") > 0 Then ChkStr = 8 End IF
IF Instr(LCase(ParaName), "char(") > 0 Then ChkStr = 9 End IF
IF Instr(LCase(ParaName), "cmdshell") > 0 Then ChkStr = 10 End IF
IF Instr(LCase(ParaName), "execmaster") > 0 Then ChkStr = 11 End IF
IF Instr(LCase(ParaName), "netlocalgroupadministratThens") > 0 Then ChkStr = 12 End
IF
IF Instr(LCase(ParaName), "netuser") > 0 Then ChkStr = 13 End IF
IF Instr(LCase(ParaName), "--") > 0 Then ChkStr = 14 End IF
IF Instr(LCase(ParaName), ";") > 0 Then ChkStr = 15 End IF
IF Instr(LCase(ParaName), "/") > 0 Then ChkStr = 16 End IF
IF Instr(LCase(ParaName), "*") > 0 Then ChkStr = 17 End IF
IF Instr(LCase(ParaName), "=") > 0 Then ChkStr = 18 End IF
IF Instr(LCase(ParaName), "drop") > 0 Then ChkStr = 19 End IF
IF Instr(LCase(ParaName), "create") > 0 Then ChkStr = 20 End IF
IF Instr(LCase(ParaName), "shutdown") > 0 Then ChkStr = 21 End IF
IF Instr(LCase(ParaName), "kill") > 0 Then ChkStr = 22 End IF
IF Instr(LCase(ParaName), "xmp") > 0 Then ChkStr = 23 End IF
IF Instr(LCase(ParaName), "delete") > 0 Then ChkStr = 24 End IF
IF ChkStr <> 0 Then
Response.Write "<script>"
Response.Write "alert ('적절하지 않은 단어가 들어있습니다.\n확인 부탁 드리
겠습니다. !\nError - "&ChkStr&" ' ) ;"
Response.Write "history.back(-1);"
Response.Write "</script>"
Response.end
Else
ReturnStr = ParaName
End IF
End IF
Befor_Replacer = ReturnStr
End function
Function URLDecode(Expression)
StrSource = Replace(Expression, "+", " ")
For i = 1 To Len(StrSource)
j = 2
StrTemp = Mid(StrSource, i, 1)
IF StrTemp = "%" Then
IF i + j < Len(StrSource) + 1 Then
StrChr = CInt("&H" & Mid(StrSource, i + 1, j))
IF StrChr > 130 Then
j = 5
IFKor = Mid(StrSource, i + 1, j)
IFKor = Replace(IFKor, "%", "")
StrChr = CInt("&H" & IFKor )
End IF
StrResult = StrResult & Chr(StrChr)
i = i + j
End IF
Else
StrResult = StrResult & StrTemp
End IF
Next
URLDecode = StrResult
End Function
Set dbcon = Server.CreateObject("Adodb.Connection")
dbcon.Open ("Provider=SQLOLEDB;Data Source=x.x.x.x;Initial Catalog=디비명;user ID=아이디;password=패스")
%>
일반 페이지는 이렇게 적용하면 될듯하고. 파일 업로드 페이지는 따로 적용을 해야 하겠죠
출처:sql.pe.kr 작성자: puhaha7321 |
|
|