웹 페이지 오류시 오류 내용 메일로 받기

목적 : 웹 페이지가 오류가 나면 사용자에게 자세한 내용은 전달하지 않고
         관리자만 보게 하여 보안내용을 감추고 빠른 대처가 가능할 수 있도록 처리하는 내용.

조건 : 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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="javascript:go_main();">△ 메인 페이지 이동</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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 수정

사용자 삽입 이미지


그리고 결과 페이지..

사용자 삽입 이미지


메일을 받으면 이렇게 나온다.

사용자 삽입 이미지