방법: 안전한 오류 메시지 표시

Visual Studio 2010

업데이트: 2007년 11월

응용 프로그램에서 오류 메시지를 표시하는 경우 악의가 있는 사용자가 시스템을 공격할 때 악용할 수 있는 정보를 노출해서는 안 됩니다. 예를 들어 응용 프로그램에서 데이터베이스에 로그인하지 못한 경우 표시되는 오류 메시지에 사용자 이름이 포함되면 안 됩니다.

다음과 같은 여러 가지 방법으로 오류 메시지를 제어할 수 있습니다.

  • 원격 사용자에게 자세한 오류 메시지를 보여 주지 않도록 응용 프로그램을 구성합니다. 원격 사용자는 웹 서버 컴퓨터를 대상으로 작업하는 동안 페이지를 요청하지 않는 사용자입니다. 필요에 따라 오류를 응용 프로그램 페이지로 리디렉션할 수 있습니다.

  • 필요하면 오류 처리를 포함하고 오류 메시지를 직접 작성합니다. 오류 처리기를 통해 사용자가 로컬 사용자인지 그리고 적절하게 반응하는지 여부를 테스트할 수 있습니다.

  • 처리되지 않은 모든 예외를 catch한 다음 이 예외를 일반 오류 페이지로 라우팅하는 전역 오류 처리기를 페이지 또는 응용 프로그램 수준에서 만듭니다. 이 방법을 사용하면 문제를 예상하지 못했더라도 최소한 사용자에게 예외 페이지가 표시되지는 않습니다.

응용 프로그램에서 원격 사용자에게 오류 메시지를 표시하지 않도록 구성하려면

  • 응용 프로그램의 Web.config 파일에서 customErrors 요소를 다음과 같이 변경합니다.

    • mode 특성을 RemoteOnly(대/소문자 구분)로 설정합니다. 이렇게 하면 로컬 사용자, 즉 개발자에게만 자세한 오류가 표시되도록 응용 프로그램이 구성됩니다.

    • 필요에 따라, 응용 프로그램 오류 페이지를 가리키는 defaultRedirect 특성을 포함합니다.

    • 필요에 따라, 특정 오류를 특정 페이지로 리디렉션하는 <error> 요소를 포함합니다. 예를 들어 표준 404 오류(페이지를 찾을 수 없음)를 사용자의 고유한 응용 프로그램 페이지로 리디렉션할 수 있습니다.

    다음 코드 예제에서는 Web.config 파일의 일반적인 customErrors 블록을 보여 줍니다.

    <customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> 
       <error statusCode="404" redirect="NoSuchPage.aspx"/> 
       <error statusCode="403" redirect="NoAccessAllowed.aspx"/> 
    </customErrors> 
    

오류 처리를 포함하려면

  1. 오류가 발생할 가능성이 있는 문 주위에 try-catch 블록을 추가합니다.

  2. 필요에 따라 IsLocal 속성을 사용하여 로컬 사용자를 테스트하고 결과에 따라 오류 처리를 수정합니다. 127.0.0.1 값은 localhost에 해당하고 브라우저가 웹 서버와 같은 컴퓨터에 있음을 나타냅니다.

    다음 코드 예제에서는 오류 처리 블록을 보여 줍니다. 오류가 발생하면 자세한 메시지 내용과 함께 세션 상태 변수가 로드되며 응용 프로그램에서는 Session 변수를 읽고 오류를 표시할 수 있는 페이지가 표시됩니다. 오류는 사용자가 악용할 수 있는 자세한 정보가 포함되지 않도록 신중하게 작성됩니다. 사용자가 로컬 사용자이면 자세한 오류 내용이 표시됩니다. finally 블록에서 열린 리소스가 해제됩니다.

    Try
       SqlConnection1.Open()
       SqlDataAdapter1.Fill(Me.DsPubs1)
    Catch ex As Exception
       If Request.IsLocal Then
          Session("CurrentError") = ex.Message
        Else
          Session("CurrentError") = "Error processing page."
        End If
        Server.Transfer("ApplicationError.aspx")
    Finally
           SqlConnection1.Close()
    End Try
    

    try
    {
        sqlConnection1.Open();
        sqlDataAdapter1.Fill(dsCustomers1);
    }
    catch (Exception ex)
    {
        if(Request.IsLocal)
        { Session["CurrentError"] = ex.Message; }
        else
        { Session["CurrentError"] = "Error processing page."; }
        Server.Transfer("ApplicationError.aspx");
    }
    finally 
    {
        this.sqlConnection1.Close();
    }
    

페이지 수준 또는 전체 응용 프로그램 수준에서 처리되지 않은 모든 예외를 catch하는 오류 처리기를 만들 수도 있습니다.

전역 오류 처리기를 만들려면

  • 페이지에 전역 처리기를 만들려면 TemplateControl.Error 이벤트에 대한 처리기를 만듭니다. 응용 프로그램 차원의 오류 처리기를 만들려면 Global.asax 파일에서 HttpApplication.Error 이벤트에 코드를 추가합니다. 이러한 메서드는 페이지나 응용 프로그램에서 각각 처리되지 않은 예외가 발생할 경우 호출됩니다. 최신 오류에 대한 정보는 GetLastError 메서드를 통해 확인할 수 있습니다.

    994a1482.alert_note(ko-kr,VS.100).gif참고:

    전역 오류 처리기가 있는 경우에는 customErrors 구성 요소의 defaultRedirect 특성에 지정된 오류 처리보다 전역 오류 처리기의 우선 순위가 높습니다.

    다음 코드 예제에서는 현재 오류에 대한 정보를 가져와 Session 변수에 저장한 다음, 오류 정보를 추출하고 표시할 수 있는 일반 오류 처리 페이지를 호출하는 처리기를 보여 줍니다.

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Session("CurrentError") = "Global: " & _
            Server.GetLastError.Message
        Server.Transfer("lasterr.aspx")
    End Sub
    

    protected void Application_Error(Object sender, EventArgs e)
    {
        Session["CurrentError"] = "Global: " + 
            Server.GetLastError().Message;
        Server.Transfer("lasterr.aspx");
    }
    
표시: