웹 페이지 오류시 오류 내용 메일로 받기
목적 : 웹 페이지가 오류가 나면 사용자에게 자세한 내용은 전달하지 않고
관리자만 보게 하여 보안내용을 감추고 빠른 대처가 가능할 수 있도록 처리하는 내용.
조건 : 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 수정
그리고 결과 페이지..
메일을 받으면 이렇게 나온다.