'공부하자 공부~'에 해당되는 글 19건
- 2009.05.27 웹 페이지 오류시 오류 내용 메일로 받기
- 2009.05.27 SQL Injection 처리 및 QueryString 값 제한..
- 2009.04.17 네이버 오픈 소스 - 스마트 에디터..
- 2009.04.03 DB 연결시 DBNMPNTW 메세지 발생시 처리 내용.
- 2008.11.24 참고링크
- 2008.11.07 SOAP(Simple Object Access Protocol) vs REST(Representational State Transfer)
- 2008.11.04 웹 서비스 기초 자료.
- 2008.11.04 닷넷 웹서비스에 대하여.
- 2008.10.17 SQL Injection 공격 확인 및 메일 발송 스크립트
- 2008.10.09 회원 가입시 보안 SSL 적용 페이지에 대한 개선안
웹 페이지 오류시 오류 내용 메일로 받기
목적 : 웹 페이지가 오류가 나면 사용자에게 자세한 내용은 전달하지 않고
관리자만 보게 하여 보안내용을 감추고 빠른 대처가 가능할 수 있도록 처리하는 내용.
조건 : IIS 서비스 내에 SMTP 서비스가 가동되고 있어야 함.
내용 : IIS5.0 과 6.0 테스트 완료.
설명
기존에 ASP 코드에러가 나는 페이지는 아래와 같이 표시되었슴.
해당 오류가 나면서 테이블 명 또는 DB 접속 정보등이 노출되거나
사용자가 오류에 대한 내용을 잘 인지못해 셋팅을 변경 합니다.
먼저 페이지를 만듭니다.
해당 페이지는 Microsoft 에서 기본 지원하는 페이지를 입맛에 맞게 바꾸고 오류 내용에 대한 것을 메일로 보내도록 수정한 것입니다.
============================ Source 내용 ============================
<%@ language="VBScript" %>
<%
' 에러 메시지 출력 페이지
' 2009년 5월 25일 작성
Option Explicit
Const lngMaxFormBytes = 200
Dim objASPError, blnErrorWritten, strServername, strServerIP, strRemoteIP
Dim strMethod, lngPos, datNow, strQueryString, strURL
Dim errormain
If Response.Buffer Then
Response.Clear
Response.Status = "500 Internal Server Error"
Response.ContentType = "text/html"
Response.Expires = 0
End If
Set objASPError = Server.GetLastError
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>이 페이지를 표시할 수 없습니다.</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=ks_c_5601-1987">
<STYLE type="text/css">
BODY { font: 9pt/12pt 굴림 }
H1 { font: 13pt/15pt 굴림 }
H2 { font: 9pt/12pt 굴림 }
A:link { color: red }
A:visited { color: maroon }
</STYLE>
<script language="javascript">
function go_main() {
try {
opener.location.href = "/";
} catch (e) {
parent.location.href="/";
}
}
</script>
</HEAD><BODY><TABLE width=500 border=0 cellspacing=10><TR><TD>
<h1>이 페이지를 표시할 수 없습니다.</h1>
연결하려는 페이지에 문제가 있어 표시할 수 없습니다.
<hr>
<ul>
<li>해당 오류는 관리자에게 메일로 전송 되었습니다.<br><br>
잠시 후에 다시 접속하시거나 메인페이지로 이동 후 재 접속을 부탁 드립니다.</li>
</ul>
<hr>
<ul>
<a href="javascript:history.back();">◀◁ 이전 페이지 이동</a>
<a href="javascript:go_main();">△ 메인 페이지 이동</a>
<a href="javascript:location.reload();">▽ 페이지 다시 읽기</a>
</ul>
<hr>
<%
errormain = "<META HTTP-EQUIV=""Content-Type"" Content=""text/html; charset=ks_c_5601-1987"">" & chr(13)
errormain = errormain & "<STYLE type=""text/css"">" & chr(13)
errormain = errormain & " BODY { font: 9pt/12pt 굴림 }" & chr(13)
errormain = errormain & " H1 { font: 13pt/15pt 굴림 }" & chr(13)
errormain = errormain & " H2 { font: 9pt/12pt 굴림 }" & chr(13)
errormain = errormain & " A:link { color: red }" & chr(13)
errormain = errormain & " A:visited { color: maroon }" & chr(13)
errormain = errormain & "</STYLE><body style=""font-size:9pt;"">" & chr(13)
errormain = errormain & "<p>기술 정보(지원 인력용)</p>" & chr(13)
errormain = errormain & "<ul>" & chr(13)
errormain = errormain & "<li>오류 유형:<br>" & chr(13)
Dim bakCodepage
on error resume next
bakCodepage = Session.Codepage
Session.Codepage = 1252
on error goto 0
errormain = errormain & Server.HTMLEncode(objASPError.Category)
If objASPError.ASPCode > "" Then Response.Write Server.HTMLEncode(", " & objASPError.ASPCode)
errormain = errormain & Server.HTMLEncode(" (0x" & Hex(objASPError.Number) & ")" ) & "<br>"
If objASPError.ASPDescription > "" Then
errormain = errormain & Server.HTMLEncode(objASPError.ASPDescription) & "<br>"
elseIf (objASPError.Description > "") Then
errormain = errormain & Server.HTMLEncode(objASPError.Description) & "<br>"
end if
blnErrorWritten = False
' Only show the Source if it is available and the request is from the same machine as IIS
If objASPError.Source > "" Then
strServername = LCase(Request.ServerVariables("SERVER_NAME"))
strServerIP = Request.ServerVariables("LOCAL_ADDR")
strRemoteIP = Request.ServerVariables("REMOTE_ADDR")
If (strServerIP = strRemoteIP) And objASPError.File <> "?" Then
errormain = errormain & Server.HTMLEncode(objASPError.File)
If objASPError.Line > 0 Then errormain = errormain & ", line " & objASPError.Line
If objASPError.Column > 0 Then errormain = errormain & ", column " & objASPError.Column
errormain = errormain & "<br>"
errormain = errormain & "<font style=""COLOR:000000; FONT: 8pt/11pt courier new""><b>"
errormain = errormain & Server.HTMLEncode(objASPError.Source) & "<br>"
If objASPError.Column > 0 Then errormain = errormain & String((objASPError.Column - 1), "-") & "^<br>"
errormain = errormain & "</b></font>"
blnErrorWritten = True
End If
End If
If Not blnErrorWritten And objASPError.File <> "?" Then
errormain = errormain & "<b>" & Server.HTMLEncode( objASPError.File)
If objASPError.Line > 0 Then errormain = errormain & Server.HTMLEncode(", line " & objASPError.Line)
If objASPError.Column > 0 Then errormain = errormain & ", column " & objASPError.Column
errormain = errormain & "</b><br>"
End If
errormain = errormain & "</li>" & chr(13)
errormain = errormain & "<li>브라우저 종류:<br> " & Server.HTMLEncode(Request.ServerVariables("HTTP_USER_AGENT")) & "<br><br></li>" & chr(13)
errormain = errormain & "<li>페이지:<br>" & chr(13)
strMethod = Request.ServerVariables("REQUEST_METHOD")
errormain = errormain & strMethod & " "
If strMethod = "POST" Then
errormain = errormain & Request.TotalBytes & " bytes to "
End If
errormain = errormain & Request.ServerVariables("SCRIPT_NAME")
errormain = errormain & "</li>"
If strMethod = "POST" Then
errormain = errormain & "<p><li>POST Data:<br>"
' On Error in case Request.BinaryRead was executed in the page that triggered the error.
On Error Resume Next
If Request.TotalBytes > lngMaxFormBytes Then
errormain = errormain & Server.HTMLEncode(Left(Request.Form, lngMaxFormBytes)) & " . . ."
Else
errormain = errormain & Server.HTMLEncode(Request.Form)
End If
On Error Goto 0
errormain = errormain & "</li>"
End If
errormain = errormain & "<br><br></li>"
errormain = errormain & "<li>시간:<br>"
datNow = Now()
errormain = errormain & Server.HTMLEncode(FormatDateTime(datNow, 1) & ", " & FormatDateTime(datNow, 3))
on error resume next
Session.Codepage = bakCodepage
on error goto 0
errormain = errormain & "<br><br></li>"
errormain = errormain & "<li>사용자 정보:<br>"
errormain = errormain & "IP address : " & Request.ServerVariables("REMOTE_ADDR") & "<br>"
errormain = errormain & "USER ID : " & Session("User_ID") & "<br>"
errormain = errormain & "URL : " & LCase(Request.ServerVariables("SERVER_NAME")) & Lcase(Request.ServerVariables("URL")) & "<br>"
errormain = errormain & "<br><li>Session Contents : <br>"
Dim key
For Each key in Session.Contents
errormain = errormain & key & " : " & Session(key) & "<br>"
Next
errormain = errormain & "<br><li>Cookies Value<br>"
For Each key in Request.Cookies
errormain = errormain & key & " : " & Request.cookies(key) & "<br>"
Next
errormain = errormain & "<br><li>Form Value<br>"
For Each key in Request.Form
errormain = errormain & key & " : " & Request.Form(key) & "<br>"
Next
errormain = errormain & "<br><li>QueryString Value<br>"
For Each key in Request.QueryString
errormain = errormain & key & " : " & Request.QueryString(key) & "<br>"
Next
on error goto 0
errormain = errormain & "<br><br></li>"
errormain = errormain & "</ul>"
If instr(Request.ServerVariables("server_software"),"6.0") > 0 then
Dim sch, cdoConfig, cdoMessage
sch = "http://schemas.microsoft.com/cdo/configuration/"
Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
.Item(sch & "sendusing") = 2 'cdoSendUsingPort 1=내부, 2=외부
.Item(sch & "smtpserverport") = 25 'SMTP Port
.Item(sch & "smtpserver") = 수정필요 'Mail Server Address or Domain or "localhost"
.update
End With
Set cdoMessage = CreateObject("CDO.Message")
With cdoMessage
Set .Configuration = cdoConfig
.From = 보내는 이 메일 주소 삽입 '보내는이 메일주소
.To = 받는사람 메일 주소 삽입 '받는이 메일주소
.Subject = LCase(Request.ServerVariables("SERVER_NAME")) & Lcase(Request.ServerVariables("URL")) & " 오류입니다." '메일제목
.HtmlBody = errormain '메일형식지정 : HtmlBody or TextBody
.BodyPart.Charset="ks_c_5601-1987"
.HTMLBodyPart.Charset="ks_c_5601-1987"
.Send
End With
Set cdoMessage = Nothing
Set cdoConfig = Nothing
Else
Dim objMail
Set objMail = Server.CreateObject("CDONTS.NewMail")
objMail.From = 보내는 이 메일 주소 삽입
objMail.To = 받는사람 메일 주소 삽입
objMail.Subject = LCase(Request.ServerVariables("SERVER_NAME")) & Lcase(Request.ServerVariables("URL")) & " 오류입니다."
objMail.Body = errormain
objMail.BodyFormat = 0 ' HTML일떄 0, 일반 Text일때 1 으로 설정한다.
objMail.MailFormat = 0 ' HTML일떄 0, 일반 Text일때 1 으로 설정한다.
objMail.send '
SET objMail = NOTHING
End If
If left(Request.ServerVariables("REMOTE_ADDR"),10) = 특정아이피 대역 then
%><br>
<span style="font-weight:bold;color:red;">아래의 에러 메시지는 내부에서만 확인 가능 합니다.</span>
<%=errormain%>
<% End If %>
</TD></TR></TABLE></BODY></HTML>
오류가 났을때 위의 페이지를 출력하기 위한 IIS 수정
그리고 결과 페이지..
메일을 받으면 이렇게 나온다.
SQL Injection 처리 및 QueryString 값 제한..
목적 : SQL Injection 이 들어오는 QueryString 값을 제한하여 초기대응함과 동시에
로그인시 필요한 Return URL 을 제외한 모든 QueryString 값의 길이를 구별하여 50자 이상의
쿼리 스트링은 모두 접근 거부 하고자 함.
조건
- 아래의 소스는 모든 페이지에 include 형태로 존재하고 있어야 함.
- Option Explicit 구문 사용시 변수명 중복에 주의 하여야 함.
- XML 화일이 저장되는 곳의 폴더 권한 설정 필요.
- 정상 요청도 막는 경우가 있으니 항상 XML 화일 확인하여 정상접근을 해제 해 주어야 함.
추가
- 아래의 소스는 인터넷 어딘가에서 퍼온 소스를 수정한것이나 원작자를 기억하지 못하고 있습니다.
- 참고된 소스의 원작자가 보고 계시다면 연락 부탁 드립니다.
====================== 이하 소스 ============================================
' ===========================
' injection 처리
' ===========================
' 변수 선언 ( 타 소스와 중복되지 않게 주의 요망 )
Dim injection_filter, item, inj_qs, injection_filter_arr
Dim injection_filter_cnt, j, get_check, post_check
injection_filter = "having|syscomments|xp_displayqueuemesgs|xp_printstatements|table|raiserror|xp_dsinfo|xp_peekqueue|--|shutdown|exec|xp_mergelineages|xp_proxiedmetadata|select|kill|xp_|xp_readpkfromqueue|xp_displayparamstmt|insert|declare|sp_|xp_readpkfromvarbin|xp_availablemedia|update|openrowset|xp_cmdshell|xp_repl_encrypt|xp_enumdsn|delete|opendatasource|xp_reg|xp_resetqueue|xp_filelist|drop|pwdencrypt|xp_servicecontrol|xp_sqlinventory|sp_password|alter|msdasql|xp_setsqlsecurity|xp_unpackcab|sp_adduser|create|sqloledb|xp_readerrorlog|xp_sprintf|sp_addextendedproc|inner|join|char(|xp_controlqueueservice|xp_displayparamstmt|sp_dropextendedproc|from|syslogins|xp_createprivatequeue|xp_enumresult|sp_add_job|where|sysxlogins|xp_decodequeuecommand|xp_showcolv|sp_start_job|union|sysdatabases|xp_deleteprivatequeue|xp_updatecolvbm|sp_delete_alert|group|by|sysobjects|xp_deletequeue|xp_execresultset|sp_msrepl_startup|%20and%20|isMember|administrators /add|xp_dirtree|--|2=2|3=3|a=a|b=b|c=c|…|;’|’;"
' 등록된 Injection 코드 발견시 XML 로그 생성할 function
Function objXML_Log(BAD_WORD,QUERY_STRING)
' 함수내 변수 선언
Dim objXML, blnFileExist
Dim objXMLv
Dim intID
Dim xml_file_name
' 에러처리
On Error Resume Next
Set objXML = server.CreateObject("Microsoft.XMLDOM")
objXML.async = False
'-----파일명칭 ( 로그가 쌓일 XML 화일의 경로를 지정 - 보통은 화일 업로드 폴더에 따로 넣어둠 )
xml_file_name = "/FileHome/injection.xml"
'-----파일이 존재하는지 체크
blnFileExist = objXML.load(server.MapPath(xml_file_name))
If blnFileExist = False Then
objXML.appendChild(objXML.createProcessingInstruction("xml","version=""1.0"""))
objXML.appendChild(objXML.createElement("IP_LOGS"))
intID = 1
Else
intID = objXML.documentElement.childNodes(objXML.documentElement.childNodes.length - 1).childNodes(0).text + 1
End If
'-----프로세스 시작
Set objXMLv = objXML.createElement("IP_LOG")
objXMLv.appendChild(objXML.createElement("ID"))
objXMLv.appendChild(objXML.createElement("USER_ID"))
objXMLv.appendChild(objXML.createElement("BAD_WORD"))
objXMLv.appendChild(objXML.createElement("QUERY_STRING"))
objXMLv.appendChild(objXML.createElement("HTTP_REFERER"))
objXMLv.appendChild(objXML.createElement("REMOTE_ADDR"))
objXMLv.appendChild(objXML.createElement("LOCAL_ADDR"))
objXMLv.appendChild(objXML.createElement("DATE"))
objXMLv.childNodes(0).text = intID
objXMLv.childNodes(1).text = session("USER_ID")
objXMLv.childNodes(2).text = BAD_WORD
objXMLv.childNodes(3).text = Request.ServerVariables("SCRIPT_NAME") &"?"& QUERY_STRING
objXMLv.childNodes(4).text = Request.ServerVariables("HTTP_REFERER")
objXMLv.childNodes(5).text = Request.ServerVariables("REMOTE_ADDR")
objXMLv.childNodes(6).text = Request.ServerVariables("LOCAL_ADDR")
objXMLv.childNodes(7).text = Now()
'-----파일 저장
objXML.documentElement.appendChild(objXMLv.cloneNode(True))
objXML.save(server.MapPath(xml_file_name))
'-----객체 해제
Set objXMLv = Nothing
Set objXML = Nothing
End Function
' 실제 Injection 공격이 있는지 확인 하는 Function
Function f_injection(query_string)
f_injection = false
injection_filter_arr = split(injection_filter,"|")
injection_filter_cnt = Ubound(injection_filter_arr)
for j = 0 to injection_filter_cnt
if InStr(1,query_string,injection_filter_arr(j),1) > 0 Then
f_injection = true
' Injection 공격 명령어 리스트에 있는 단어이면 오류 메시지 출력
Response.Write " (필터링된 문자 : <font color=blue>"& injection_filter_arr(j) &"</font>)<br>"
Call objXML_Log(injection_filter_arr(j),query_string)
Response.End
exit for
end if
next
End function
'post체크
For each item in REQUEST.FORM
For i=1 to REQUEST.FORM(item).Count
If REQUEST.FORM(item)(i) <> "" Then
If f_injection(REQUEST.FORM(item)(i)) = true then
post_check = true
exit for
End if
End if
Next
Next
' QueryString 길이 체크하여 블럭처리
For Each item in Request.QueryString
If item <> "redirect_URL" Then
If len(Request.QueryString(item)) >= 50 Then
Response.write "전달하는 값의 길이가 너무 길어 공격 시도로 판단되어 처리를 종료합니다."
response.end
End If
End If
Next
'QueryString 내용에 Injection 구문 체크
inj_qs = Request.ServerVariables("QUERY_STRING")
If inj_qs <> "" Then
get_check = f_injection(unescape(inj_qs))
End if
if post_check = true or get_check = true then
Response.End
End if
%>
네이버 오픈 소스 - 스마트 에디터..
네이버에서 제공되는 위지윅 에디터인 스마트 에디터 입니다.
웹상에서만 사용되고 있는 줄알았는데..
이게 오픈소스로 공개 했군요..
상용 사이트에 사용해도 무리가 없을 정도로 퀄리티가 있는 것 같은데..
적용을 해 봐야 겠습니다.
http://dev.naver.com/projects/smarteditor
DB 연결시 DBNMPNTW 메세지 발생시 처리 내용.
접속 명령어 뒤에
Network Library=DBMSSOCN 을 추가.
처음 알았다... -_-;;
참고링크
SOAP(Simple Object Access Protocol) vs REST(Representational State Transfer)
내용을 보시려면 비밀번호를 입력하세요.
웹 서비스 기초 자료.
내용을 보시려면 비밀번호를 입력하세요.
닷넷 웹서비스에 대하여.
내용을 보시려면 비밀번호를 입력하세요.
SQL Injection 공격 확인 및 메일 발송 스크립트
http://blog.daum.net/_blog/BlogView.do?blogid=0KYRA&articleno=6787162
위의 홈페이지에서 해당 소스를 받아서 SQL Injection 의심사례 발생시 메일로 전달되게 하였습니다.
매번 XML 페이지를 보기도 뭣하고 해서리..
또 다른 방법으로는 XML 파싱 부분을 좀 수정 해서 RSS 구독설정 해 놓는것도 좋은 방법이 될거라 생각 됩니다.
<%
' ===========================
' injection 처리
' ===========================
' SQL Injection 필터 정의 ( www.krcert.or.kr 및 기타 참조 )
injection_filter = ""
injection_filter = injection_filter & "having|syscomments|xp_displayqueuemesgs|xp_printstatements|table|raiserror|xp_dsinfo|xp_peekqueue|--|"
injection_filter = injection_filter & "shutdown|exec|xp_mergelineages|xp_proxiedmetadata|select|kill|xp_|xp_readpkfromqueue|"
injection_filter = injection_filter & "xp_displayparamstmt|insert|declare|sp_|xp_readpkfromvarbin|xp_availablemedia|update|openrowset|"
injection_filter = injection_filter & "xp_cmdshell|xp_repl_encrypt|xp_enumdsn|delete|opendatasource|xp_reg|xp_resetqueue|xp_filelist|"
injection_filter = injection_filter & "drop|pwdencrypt|xp_servicecontrol|xp_sqlinventory|sp_password|alter|msdasql|xp_setsqlsecurity|"
injection_filter = injection_filter & "xp_unpackcab|sp_adduser|create|sqloledb|xp_readerrorlog|xp_sprintf|sp_addextendedproc|inner|join|"
injection_filter = injection_filter & "char(|xp_controlqueueservice|xp_displayparamstmt|sp_dropextendedproc|from|syslogins|"
injection_filter = injection_filter & "xp_createprivatequeue|xp_enumresult|sp_add_job|where|sysxlogins|xp_decodequeuecommand|xp_showcolv|"
injection_filter = injection_filter & "sp_start_job|union|sysdatabases|xp_deleteprivatequeue|xp_updatecolvbm|sp_delete_alert|group|by|"
injection_filter = injection_filter & "sysobjects|xp_deletequeue|xp_execresultset|sp_msrepl_startup|"
injection_filter = injection_filter & "%20and%20|isMember|administrators /add|xp_dirtree|--|2=2|3=3|a=a|b=b|c=c|…|;’|’;"
Function objXML_Log(BAD_WORD,QUERY_STRING)
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'IP,시간등 XML파일로 기록한다.
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
On Error Resume Next
Set objXML = server.CreateObject("Microsoft.XMLDOM")
objXML.async = False
'-----파일명칭- 결과 XML 화일이 저장될 공간을 지정 ( 권한 확인 필요 )
xml_file_name = "/FileHome/injection.xml"
'-----파일이 존재하는지 체크
blnFileExist = objXML.load(server.MapPath(xml_file_name))
If blnFileExist = False Then
objXML.appendChild(objXML.createProcessingInstruction("xml","version=""1.0"""))
objXML.appendChild(objXML.createElement("IP_LOGS"))
intID = 1
Else
intID = objXML.documentElement.childNodes(objXML.documentElement.childNodes.length - 1).childNodes(0).text + 1
End If
'-----프로세스 시작
Set objXMLv = objXML.createElement("IP_LOG")
objXMLv.appendChild(objXML.createElement("ID"))
objXMLv.appendChild(objXML.createElement("USER_ID"))
objXMLv.appendChild(objXML.createElement("BAD_WORD"))
objXMLv.appendChild(objXML.createElement("QUERY_STRING"))
objXMLv.appendChild(objXML.createElement("HTTP_REFERER"))
objXMLv.appendChild(objXML.createElement("REMOTE_ADDR"))
objXMLv.appendChild(objXML.createElement("LOCAL_ADDR"))
objXMLv.appendChild(objXML.createElement("DATE"))
objXMLv.childNodes(0).text = intID
objXMLv.childNodes(1).text = session("USER_ID") ' 회원 가입 페이지라면 회원 아이디도 넣을 수 있도록..
objXMLv.childNodes(2).text = BAD_WORD
objXMLv.childNodes(3).text = Request.ServerVariables("SCRIPT_NAME") &"?"& QUERY_STRING
objXMLv.childNodes(4).text = Request.ServerVariables("HTTP_REFERER")
objXMLv.childNodes(5).text = Request.ServerVariables("REMOTE_ADDR")
objXMLv.childNodes(6).text = Request.ServerVariables("LOCAL_ADDR")
objXMLv.childNodes(7).text = Now()
' 오류내용을 보고할 메일 본문 작성
MainCont = ""
MainCont = MainCont & "<table width=""700"" cellspacing=""0"" cellpadding=""0"" border=""1"" style=""font-size:9pt;"">"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">번호</td><td width=""500""> "&intID&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">아이디</td><td width=""500""> "&session("USER_ID")&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">금지단어</td><td width=""500""> "&BAD_WORD&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">넘어온 값</td><td width=""500""> "&Request.ServerVariables("SCRIPT_NAME") &"?"& QUERY_STRING
objXMLv.childNodes(4).text = Request.ServerVariables("HTTP_REFERER")&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">이전 페이지</td><td width=""500""> "&Request.ServerVariables("HTTP_REFERER")&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">클라이언트 아이피</td><td width=""500""> "&Request.ServerVariables("REMOTE_ADDR")&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">서버 아이피</td><td width=""500""> "&Request.ServerVariables("LOCAL_ADDR")&"</td></tr>"
MainCont = MainCont & "<tr bgcolor=""#FFFFFF""><td height=""26"" width=""200"" align=""center"">날짜</td><td width=""500""> "&Now()&"</td></tr></table>"
' Injection 의심내용 메일로 전달
Call objXML_Email(발신자 메일 주소 임의로 입력,관리자 이메일 주소,"SQL 오류가 발생 되었습니다.",MainCont)
'-----파일 저장
objXML.documentElement.appendChild(objXMLv.cloneNode(True))
objXML.save(server.MapPath(xml_file_name))
'-----객체 해제
Set objXMLv = Nothing
Set objXML = Nothing
End Function
'------ 메일 발송 함수. SMTP 가 설정되어 있어야 함.
Function objXML_Email(FromMail,ToMail,strTitle,MainCont)
sch = "http://schemas.microsoft.com/cdo/configuration/"
Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
.Item(sch & "sendusing") = 1 'cdoSendUsingPort 1=내부, 2=외부
.Item(sch & "smtpserverport") = 25 'SMTP Port
.Item(sch & "smtpserver") = "localhost" 'Mail Server Address or Domain or "localhost"
.update
End With
Set cdoMessage = CreateObject("CDO.Message")
With cdoMessage
Set .Configuration = cdoConfig
.From = FromMail '보내는이 메일주소
.To = ToMail '받는이 메일주소
.Subject = strTitle '메일제목
.HtmlBody = MainCont '메일형식지정 : HtmlBody or TextBody
.Send
End With
Set cdoMessage = Nothing
Set cdoConfig = Nothing
End Function
Function f_injection(query_string)
f_injection = false
injection_filter_arr = split(injection_filter,"|")
injection_filter_cnt = Ubound(injection_filter_arr)
for injection_j = 0 to injection_filter_cnt
if InStr(1,query_string,injection_filter_arr(injection_j),1) > 0 Then
f_injection = true
' 오류 메시지 후 페이지 로딩을 중단 하려면 아래의 주석을 제거 합니다.
' Response.Write "특수문자 또는 명령어는 서버에 전달할 수 없습니다. (필터링된 문자 : <font color=blue>"& injection_filter_arr(injection_j) &"</font>)<br>"
Call objXML_Log(injection_filter_arr(injection_j),query_string)
' Response.End
exit for
end if
next
End function
'post체크
For each injection_item in REQUEST.FORM
For i=1 to REQUEST.FORM(injection_item).Count
If REQUEST.FORM(injection_item)(i) <> "" Then
If f_injection(REQUEST.FORM(injection_item)(i)) = true then
post_check = true
exit for
End if
End if
Next
Next
'get체크
inj_qs = Request.ServerVariables("QUERY_STRING")
If inj_qs <> "" Then
get_check = f_injection(unescape(inj_qs))
End if
if post_check = true or get_check = true then
Response.End
End if
%>