Использование подробных ошибок HTTP в IIS 7.0

от команды IIS

Введение

Каждый администратор Web-Site или веб-разработчик видел в браузере сообщения "404 — файл не найден", "401 - не авторизовано" или "500 - ошибка сервера". Эта статья поможет вам понять, как и почему службы IIS создают эти ошибки и как их можно настроить.

Многие могут подумать, что создание сообщений об ошибках не оправдывает полную статью. Но есть больше ошибок, чем встречает глаз. Сообщения об ошибках — это деликатная тема, так как каждая ошибка показывает больше о вашем веб-сайте, чем может потребоваться. Чем больше информации кто-то может собрать о вашем сайте, тем больше это то, что вы будете взломаны. Поиск по запросу "google hacking" или "межсайтовые скрипты" показывает множество информации по этой теме.

Однако сообщения об ошибках также являются ценным инструментом для устранения неполадок. Разработчикам и администраторам Web-Site требуется как можно больше сведений при возникновении ошибки. В идеале сообщение об ошибке дает рекомендации по устранению проблемы. Вот как IIS решает эти принципиально противоположные цели.

Ошибки, какие ошибки?

В этой статье рассказывается об ошибках HTTP, указанных в RFC HTTP (RFC 2616 — раздел 6.1.1). Ошибка HTTP всегда выражается путем отправки ответа с кодом состояния больше 400 обратно запрашивающего клиента.

Client Errors

Коды состояния от 400 до 500 указывают на ошибку, сделанную клиентом, например неправильный синтаксис или запрос к несуществующим ресурсам. Это можно сделать, запросив фиктивный URL-адрес с выбранного веб-сайта, например http://< IIS7Server>/this_resource_does_not_exist. Появляется сообщение об ошибке 404 — файл не найден.

Server Errors

Коды состояния, начиная с 500, — это ошибки, вызванные сервером. Наиболее распространенные причины ошибок 500 в системах IIS:

  • Страница ASP или ASPX, содержащая синтаксическую ошибку
  • Невозможно прочитать конфигурацию веб-сервера или конфигурацию приложения или недопустимую
  • Сайт остановлен

Важно отметить, что браузеры, такие как IE, часто заменяют ошибки, возвращаемые с веб-сервера, собственными ошибками. Это усложняет устранение неполадок. В IE эту функцию можно отключить. Перейдите в меню "Сервис", выберите "Свойства браузера", перейдите на вкладку "Дополнительно" и найдите проверка поле "Показать понятные сообщения об ошибках HTTP" и снимите флажок. Чтобы просмотреть необработанный ответ, используйте средства HTTP, такие как WFETCH, в наборе ресурсов IIS 6.0 (см. раздел "Связанные ссылки").

Ошибки HTTP в IIS

При возникновении ошибки в модуле httpError (custerr.dll) может произойти две вещи:

  • Создается пользовательская ошибка
  • Создается подробная ошибка

Пользовательские ошибки — это страницы ошибок, которые видят обычные пользователи веб-сайта. Они содержат краткое описание ошибки, из-за которой произошла ошибка, но ничего другого. Ниже приведена пользовательская ошибка, возникающая при запросе ресурса, который не существует, например: http://< IIS7Server>/this_resource_does_not_exist

Снимок экрана: файл или каталог ошибки H T P 404, который не найден в Обозреватель Интернета.

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

Снимок экрана: ошибка сервера на веб-странице приложения веб-сайта по умолчанию с разделом причины и решения ошибки.

Это опасно, так как подробные ошибки содержат сведения о внутренней работе веб-сайта. Только доверенный персонал должен видеть подробную ошибку. Единственный способ обеспечить это — создать подробную ошибку только в том случае, если запрос поступает с локального компьютера. Как только запрос не является локальным, создается пользовательская ошибка. Посмотрите на следующую схему потоков:

Схема подсостояния состояния, тела сущности и пути задания ошибки для создания подробной ошибки.

Поток данных

Во-первых: проверка ошибок

Модуль httpError получает уведомление, если ответ будет отправлен (RQ_SEND_RESPONSE уведомление). Модуль httpError проверяет код состояния этого ответа и немедленно возвращает, если код состояния не превышает 400.

Во-вторых: пользовательская ошибка или подробная ошибка

Следующий проверка определяется источником запроса (это локальный или удаленный запрос) и параметром свойства errorMode. Свойство errorMode имеет значение DetailedLocalOnly, что означает, что пользовательские ошибки создаются для каждого удаленного запроса. Если параметр errorMode имеет значение "Custom", все ответы об ошибках будут станут пользовательскими ошибками. Если параметр errorMode имеет значение "Подробный", все ответы на ошибки будут станут подробными ошибками. В следующей таблице описано это поведение:

errorMode Источник запроса Действие
DetailedLocalOnly (по умолчанию) Local Подробная ошибка
DetailedLocalOnly (по умолчанию) Remote Пользовательская ошибка
Особые настройки Local Пользовательская ошибка
Особые настройки Remote Пользовательская ошибка
Подробный Local Подробная ошибка
Подробный Remote Подробная ошибка

Если модуль httpError определяет, что должна быть создана пользовательская ошибка, он просматривает его конфигурацию, чтобы узнать, может ли он найти соответствующую ошибку. Если совпадение найдено, он отправляет статический файл, перенаправляет запрос или выполняет указанный URL-адрес. Если совпадение не найдено, службы IIS отправляют базовое однострочное сообщение, содержащее код состояния. В следующем разделе подробно описывается конфигурация пользовательской ошибки.

Если custerr.dll определяет, что должна быть создана подробная ошибка, требуется еще одна проверка. Службы IIS не затрагивают ответ, если модуль переопределил сущность ответа собственным описанием ошибки. Он может содержать ценную информацию. ASP.NET является хорошим примером. Сущность ответа об ошибке ASP.NET может содержать стек исключений и собственное описание ошибки. Подробная ошибка создается, только если текст сущности ответа пуст.

<httpErrors> Конфигурация

Ниже приведен раздел пользовательской ошибки IIS, полученный при чистой установке:

<httpErrors>
    <error statusCode="401" prefixLanguageFilePath="c:\inetpub\custerr" path="401.htm" />
    <error statusCode="403" prefixLanguageFilePath="c:\inetpub\custerr" path="403.htm" />
    <error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />
    <error statusCode="405" prefixLanguageFilePath="c:\inetpub\custerr" path="405.htm" />
    <error statusCode="406" prefixLanguageFilePath="c:\inetpub\custerr" path="406.htm" />
    <error statusCode="412" prefixLanguageFilePath="c:\inetpub\custerr" path="412.htm" />
    <error statusCode="500" prefixLanguageFilePath="c:\inetpub\custerr" path="500.htm" />
    <error statusCode="501" prefixLanguageFilePath="c:\inetpub\custerr" path="501.htm" />
    <error statusCode="502" prefixLanguageFilePath="c:\inetpub\custerr" path="502.htm" />
</httpErrors>

Вы увидите, что если код состояния ответа равен 401, службы IIS вернет файл с именем 401.htm.

Коды Sub-Status

Многие ошибки HTTP имеют вложенное состояние. Конфигурация пользовательских ошибок IIS по умолчанию не различает коды подсостояния на основе. При вводе неправильных учетных данных (401.1) или при отказе в доступе на основе недопустимых прав на доступ к файлу (401.3) отправляется та же страница "Пользовательская ошибка". Различные коды подсостояния можно просмотреть в файлах журнала или в разделе Подробные ошибки. Ниже приведен список различных кодов подсостояния 404, создаваемых службами IIS:

Состояние Описание
404.1 Не удалось найти сайт
404.2 Отклонено политикой. Запрос ISAPI или программа CGI не разрешена в списке ограничений.
404.3 Обработчик статических файлов не имеет файла в mimeMap и поэтому отклонил запрос.
404.4 Обработчик для обслуживания запроса не найден.
404.5 Модуль фильтрации запросов отклонил последовательность URL-адресов в запросе.
404.6 Модуль фильтрации запросов отклонил HTTP-команду запроса.
404.7 Модуль "Фильтрация запросов" отклонил расширение файла запроса.
404.8 Модуль "Фильтрация запросов" отклонил определенный сегмент URL-адреса (символы между двумя косыми чертами).
404.9 Служба IIS отклонена для обслуживания скрытого файла.
404.11 Модуль "Фильтрация запросов" отклонил запрос, который был дважды экранирован.
404.12 Модуль "Фильтрация запросов" отклонил запрос, содержащий символы с высокими битами.
404.14 Модуль "Фильтрация запросов" отклонил запрос с слишком длинным URL-адресом.
404.15 Модуль "Фильтрация запросов" отклонил запрос со слишком длинной строкой запроса.
413.1 Модуль "Фильтрация запросов" отклонил слишком длинный запрос (запрос + тело сущности).
431 Модуль "Фильтрация запросов" отклонил слишком длинный заголовок.

В разделе httpErrors можно настроить отображение пользовательской ошибки для определенных кодов подсостояния. Если добавить следующую строку в раздел конфигурации httpErrors, службы IIS возвращает 404_3.htm, если запрашивается файл с расширением, который не включен в раздел конфигурации IIS MimeMap (<staticContent> ).

<error statusCode="404" subStatusCode="3" prefixLanguageFilePath="c:\inetpub\custerr" path="404_3.htm" />

Ниже описано, как сделать этот пример работоемким.

  1. Добавьте приведенную выше запись в раздел конфигурации httpErrors.
  2. Создайте файл с именем 404_3.htm в каталоге c:\inetpub\custerr\en-us .
  3. Создайте файл с именем test.yyy в каталоге c:\inetpub\wwwroot .
  4. Теперь запросите http://localhost/test.yyy.

Расширение файла .yyy не является частью MimeMap IIS, и статический обработчик файлов не будет обслуживать его.

Новые возможности IIS: пользовательские ошибки для конкретного языка

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

Accept-Language: en-us

Синтаксис и реестр допустимых языков указаны в RFC1766.

При создании ошибки службы IIS учитывают этот заголовок при поиске возвращаемого файла пользовательской ошибки. Он создает путь для пользовательской ошибки, используя следующую логику:

параметр конфигурации prefixLanguageFilePath (например, c:\inetpub\custerr)+
Accept-Language заголовка, отправленного клиентом (например, en-us) +
Параметр конфигурации пути (например, 404.htm)

Пример

Если браузер отправляет запрос на несуществующий ресурс и заголовок Accept-Language имеет значение en-us, возвращаемый файл будет иметь значение c:\inetpub\custerr\en-us\404.htm.

Например, если вы из Германии, вам нужны сообщения об ошибках на немецком языке. Для этого необходимо установить языковой пакет Windows Vista для немецкого языка. При этом будет c:\inetpub\custerr\de-DE создан каталог с пользовательскими файлами ошибок. Теперь, если браузер отправляет заголовок Accept-Language со значением de-DE, возвращаемый файл будет иметь значение c:\inetpub\custerr\de-DE\404.htm.

Службы IIS всегда будут возвращаться на системный язык, если каталог de-DE не существует.

Примечание

Internet Обозреватель позволяет настроить заголовок Accept-Language. Перейдите к разделу "Сервис" — "Internet Option" (Параметры браузера), выберите вкладку "Общие" и нажмите кнопку "Языки".

Настраиваемые параметры ошибок

В приведенных выше примерах IIS отправляет содержимое файла в качестве настраиваемого ответа об ошибке. Службы IIS имеют два других способа реагирования на ошибку: выполнение URL-адреса или перенаправление запроса.

ExecuteUrl

Если вы хотите сделать больше в пользовательской ошибке, например отправить сообщение электронной почты или ведения журнала ошибки в базе данных, можно выполнить URL-адрес. Это позволяет выполнять динамическое содержимое как страницу ASP.NET. В приведенном ниже примере заменяется пользовательская ошибка 404. Теперь СЛУЖБЫ IIS выполняют /404.aspx при возникновении ошибки 404.

<httpErrors>
<!-- default custom error for 401 errors -->
<!-- <error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />-->

<!-- ExecuteURL replaces default file response mode -->
<error statusCode="404" path=/404.aspx" responseMode="ExecuteURL"/>        
<error statusCode="403" prefixLanguageFilePath="c:\inetpub\custerr" path="403.htm" />
<error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />
<error statusCode="405" prefixLanguageFilePath="c:\inetpub\custerr" path="405.htm" />
<error statusCode="406" prefixLanguageFilePath="c:\inetpub\custerr" path="406.htm" />
<error statusCode="412" prefixLanguageFilePath="c:\inetpub\custerr" path="412.htm" />
<error statusCode="500" prefixLanguageFilePath="c:\inetpub\custerr" path="500.htm" />
<error statusCode="501" prefixLanguageFilePath="c:\inetpub\custerr" path="501.htm" />
<error statusCode="502" prefixLanguageFilePath="c:\inetpub\custerr" path="502.htm" />

</httpErrors>

Вопросы безопасности

Предупреждение. По соображениям архитектуры СЛУЖБЫ IIS могут выполнять URL-адрес только в том случае, если он находится в том же пуле приложений. Используйте функцию перенаправления для выполнения пользовательской ошибки в другом пуле приложений.

СЛУЖБЫ IIS также могут возвращать перенаправление 302 в браузер при возникновении определенной ошибки. Перенаправление хорошо, если у вас есть ферма серверов. Например, вы можете перенаправить все ошибки в центральное расположение, за которым вы внимательно следите.

Однако существует риск: responseMode="File" (по умолчанию) позволяет указать каждый файл на диске. Это не будет работать, если вы очень сознательные безопасности.

Рабочий сценарий может включать только разрешение делегирования параметра errorMode. Это позволяет разработчику получать подробные ошибки для своего приложения, даже если он использует удаленный клиент. Все, что нужно, — задать errorMode="Detailed". Ниже описано, как настроить этот сценарий.

Разрешите делегирование раздела httpErrors:

<section name="httpErrors" overrideModeDefault="Allow" />

Во-вторых, перейдите к разделу <httpErrors> в applicationHost.config и измените его, чтобы делегировать только errorMode:

<httpErrors lockAllAttributesExcept="errorMode" lockElements="error">
    <error statusCode="404" prefixLanguageFilePath="E:\inetpub\custerr" path="404.htm" />
    <error statusCode="401" prefixLanguageFilePath="E:\inetpub\custerr" path="401.htm" />
    <error statusCode="403" prefixLanguageFilePath="E:\inetpub\custerr" path="403.htm" />
    <error statusCode="405" prefixLanguageFilePath="E:\inetpub\custerr" path="405.htm" />
    <error statusCode="406" prefixLanguageFilePath="E:\inetpub\custerr" path="406.htm" />
    <error statusCode="412" prefixLanguageFilePath="E:\inetpub\custerr" path="412.htm" />
    <error statusCode="500" prefixLanguageFilePath="E:\inetpub\custerr" path="500.htm" />
    <error statusCode="501" prefixLanguageFilePath="E:\inetpub\custerr" path="501.htm" />
    <error statusCode="502" prefixLanguageFilePath="E:\inetpub\custerr" path="502.htm" />
</httpErrors>

Итоги

Пользовательские и подробные ошибки — это эффективные функции IIS. Они помогают устранять неполадки без ущерба для безопасности сервера IIS. Многие параметры конфигурации помогают настраивать взаимодействие с пользователями. Самое главное: экспериментировать с ним весело.

См. также раздел