Практическое руководство. Отображение безопасных сообщений об ошибках

Visual Studio 2010

Обновлен: Ноябрь 2007

Когда приложение отображает сообщения об ошибках, они не должны содержать информацию, которая могла бы помочь злоумышленникам атаковать систему. Например, если попытка приложения войти в базу данных закончилась неудачей, оно не должно отображать сообщение об ошибке, включающее имя пользователя.

Существует несколько способов контроля над сообщениями об ошибках, включая следующие.

  • Настроить приложение таким образом, чтобы оно не выводило подробных сведений об ошибках для удаленных пользователей. (Удаленные пользователи — это пользователи, не запрашивающие страницу при работе на компьютере веб-сервера.) При необходимости сообщения об ошибках можно перенаправить на страницу приложения.

  • Включить обработку ошибок и создать собственные сообщения об ошибках. В обработчике ошибок можно проверить, является ли пользователь локальным, и действовать соответствующим образом.

  • Создать глобальный обработчик ошибок на уровне страницы или приложения, который перехватывает все необработанные исключения и передает их на универсальную страницу ошибок. Таким образом, даже если данная проблема не была предусмотрена, пользователи не будут видеть страницу исключений.

Отключение отображения ошибок для удаленных пользователей

  • В файле Web.config приложения следует внести следующие изменения в элемент customErrors.

    • Присвойте атрибуту mode значение RemoteOnly (чувствительно к регистру). При этом приложение будет настроено на отображение подробных сообщений об ошибках только для локальных пользователей (то есть разработчиков).

    • При необходимости включите атрибут defaultRedirect, указывающий на страницу ошибки приложения.

    • При необходимости включите элементы <error>, которые перенаправляют отдельные ошибки на отдельные страницы. Например, стандартные ошибки 404 (страница не найдена) можно перенаправить на страницу приложения.

    В следующем примере кода показан типичный блок customErrors файла Web.config.

    <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();
    }
    

Также можно создать обработчик ошибок, который будет перехватывать все необработанные исключения на уровне страницы или всего приложения.

Создание глобального обработчика ошибок

  • Необходимо создать обработчик события TemplateControl.Error. Для создания глобального обработчика ошибок в файле Global.asax file добавьте код в событие HttpApplication.Error. Эти методы вызываются, если на странице или в приложении возникает необработанная ошибка соответственно. Для получения сведений о последней ошибке можно использовать метод GetLastError.

    994a1482.alert_note(ru-ru,VS.100).gifПримечание.

    Если используется глобальный обработчик ошибок, он получает более высокий приоритет, чем обработка, указанная в атрибуте defaultRedirect элемента конфигурации customErrors.

    В следующем примере кода показан обработчик, который получает сведения о текущей ошибке, заносит их в переменную 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");
    }
    
Показ: