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