Удаление неиспользуемых обработчиков HTTP для повышения производительности и безопасности
Где я могу получить список того, что делают все стандартные обработчики IIS HTTP? Мне нужна документация!! Я прочитал несколько блогов, которые рекомендуют удалить десятки неиспользуемых обработчиков HTTP из соображений производительности и безопасности.
Например, рекомендуется удалить TraceHandler-Integrated и TraceHandler-Integrated-4.0, потому что в противном случае переход к /trace.axd вызывает внутреннюю ошибку сервера 500 вместо 404 Not Found, и в производственной среде трассировки не должно быть.
Некоторые из обработчиков HTTP, которые проект GitHub (сейчас удален) рекомендует удалить с вашего сайта:
<system.webServer>
<handlers>
<remove name="TraceHandler-Integrated-4.0" />
<remove name="TraceHandler-Integrated" />
<remove name="AssemblyResourceLoader-Integrated-4.0" />
<remove name="AssemblyResourceLoader-Integrated" />
<remove name="WebAdminHandler-Integrated-4.0" />
<remove name="WebAdminHandler-Integrated" />
<remove name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" />
<remove name="svc-ISAPI-4.0_32bit" />
<remove name="ScriptHandlerFactoryAppServices-Integrated-4.0" />
<remove name="ScriptResourceIntegrated-4.0" />
<remove name="svc-ISAPI-4.0_64bit" />
<remove name="svc-Integrated-4.0" />
<remove name="vbhtm-ISAPI-4.0_32bit" />
<remove name="vbhtm-ISAPI-4.0_64bit" />
<remove name="vbhtm-Integrated-4.0" />
<remove name="vbhtml-ISAPI-4.0_32bit" />
<remove name="vbhtml-ISAPI-4.0_64bit" />
<remove name="vbhtml-Integrated-4.0" />
<remove name="xamlx-ISAPI-4.0_32bit" />
<remove name="xamlx-ISAPI-4.0_64bit" />
<remove name="xamlx-Integrated-4.0" />
<remove name="xoml-ISAPI-4.0_32bit" />
<remove name="xoml-ISAPI-4.0_64bit" />
<remove name="xoml-Integrated-4.0" />
<remove name="HttpRemotingHandlerFactory-rem-Integrated-4.0" />
<remove name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" />
<remove name="rules-ISAPI-4.0_32bit" />
<remove name="rules-Integrated-4.0" />
<remove name="HttpRemotingHandlerFactory-soap-Integrated" />
<remove name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" />
<remove name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" />
<remove name="HttpRemotingHandlerFactory-soap-Integrated-4.0" />
<remove name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" />
<remove name="rules-ISAPI-4.0_64bit" />
<remove name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" />
<remove name="HttpRemotingHandlerFactory-rem-Integrated" />
<remove name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" />
<remove name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" />
<remove name="AXD-ISAPI-2.0-64" />
<remove name="cshtml-ISAPI-4.0_64bit" />
<remove name="cshtml-Integrated-4.0" />
<remove name="cshtm-Integrated-4.0" />
<remove name="cshtml-ISAPI-4.0_32bit" />
<remove name="cshtm-ISAPI-4.0_64bit" />
<remove name="cshtm-ISAPI-4.0_32bit" />
<remove name="AXD-ISAPI-4.0_64bit" />
<remove name="AXD-ISAPI-2.0" />
<remove name="AXD-ISAPI-4.0_32bit" />
<remove name="PageHandlerFactory-ISAPI-2.0-64" />
<remove name="PageHandlerFactory-ISAPI-2.0" />
<remove name="PageHandlerFactory-ISAPI-4.0_64bit" />
<remove name="PageHandlerFactory-ISAPI-4.0_32bit" />
<remove name="aspq-ISAPI-4.0_64bit" />
<remove name="aspq-Integrated-4.0" />
<remove name="WebServiceHandlerFactory-ISAPI-2.0" />
<remove name="aspq-ISAPI-4.0_32bit" />
<remove name="WebServiceHandlerFactory-Integrated-4.0" />
<remove name="WebServiceHandlerFactory-Integrated" />
<remove name="SimpleHandlerFactory-ISAPI-4.0_64bit" />
<remove name="SimpleHandlerFactory-Integrated-4.0" />
<remove name="SimpleHandlerFactory-Integrated" />
<remove name="SimpleHandlerFactory-ISAPI-2.0" />
<remove name="SimpleHandlerFactory-ISAPI-2.0-64" />
<remove name="WebServiceHandlerFactory-ISAPI-4.0_32bit" />
<remove name="WebServiceHandlerFactory-ISAPI-4.0_64bit" />
<remove name="WebServiceHandlerFactory-ISAPI-2.0-64" />
<remove name="SimpleHandlerFactory-ISAPI-4.0_32bit" />
<remove name="ISAPI-dll" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
</handlers>
</system.webServer>
4 ответа
Если вам действительно нужен минимальный набор сопоставлений обработчиков, я предлагаю начать с чистого листа, в вашем файле web.config удалите все обработчики и просто используйте StaticFile:
<system.webServer>
<handlers>
<clear />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>
</system.webServer>
Теперь добавьте все необходимые вам обработчики, только для битности и режима, в котором вы работаете.
Для базового проекта MVC может быть достаточно добавить
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
Что делают все обработчики?
Я также не смог найти никакой документации, так что вот моя попытка:
Отображения обработчика определены в %SystemRoot%\System32\inetsrv\config\applicationHost.config - system.webServer/handlers
В моем случае было 87 отображений.
50 из них modules="IsapiModule" scriptProcessor="...aspnet_isapi.dll"
для ASP.NET. Они охватывают все различные расширения asp.net и могут существовать для версий CLR 2.0 и 4.0, а также для 32-битных и 64-битных. Большинство из них для классического режима.
Они обычно обрабатывают следующие расширения:
*. = ExtensionlessUrlHandler-ISAPI
*.ashx = SimpleHandlerFactory-ISAPI
*.asmx = WebServiceHandlerFactory-ISAPI
*.aspq = aspq-ISAPI
*.aspx = PageHandlerFactory
*.axd = AXD-ISAPI
*.cshtm = cshtm-ISAPI
*.cshtml = cshtml-ISAPI
*.rem = HttpRemotingHandlerFactory-rem-ISAPI
*.rules = rules-ISAPI
*.soap = HttpRemotingHandlerFactory-soap
*.svc = svc-ISAPI
*.vbhtm = vbhtm-ISAPI
*.vbhtml = vbhtml-ISAPI
*.xamlx = xamlx-ISAPI
*.xoml = xoml-ISAPI
Если ваш проект не использует определенные расширения, вы можете удалить эти обработчики.
Большинство отображений обработчиков имеют preCondition
например, применяется в 32-битных ApplicationPools или в классическом режиме. Если вы когда-либо запускаете только интегрированный режим 64Big, вы можете удалить все классические режимы и отображения 32-битных обработчиков.
Если мы посмотрим на *.cshtml для файла представления Razor, вы найдете три сопоставления, два для Classic Mode в 32/64 бита, которые указывают на модули ASP.NET ISAPI, но третье применяется только в интегрированном режиме и сопоставляется с HttpForbiddenHandler, потому что маршрутизация MVC работает по-разному в интегрированном режиме, и вы никогда не хотите разрешить доступ к просмотру файлов напрямую.
Могут быть IsapiModules для классического asp или CGI, например, там есть отображение ASP.NET для обработки запросов на файлы с определенными расширениями.
Вторая по величине группа type="System.
обработчики, давайте посмотрим на них:
System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory
рукоятки *.rem
а также *.soap
файлы в интегрированном режиме. Может быть удалено, если вы не используете удаленное взаимодействие.
System.ServiceModel.Activation.HttpHandler, System.ServiceModel.Activation
Обрабатывает определенные запросы WCF с помощью *.rules,*.xoml,*.svc
расширения.
System.Web.Handlers.AssemblyResourceLoader
рукоятки WebResource.axd
запросы, они могут использоваться в WebForms, но обычно не в проектах MVC.
System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions
Для обработки ScriptResource.axd
который предоставляет ресурсы JavaScript и CSS в WebForms.
System.Web.Handlers.TraceHandler
Обработчик для trace.axd
для отображения информации трассировки ASP.NET. На производственном сайте вы хотите удалить этот обработчик.
System.Web.Handlers.TransferRequestHandler
Используется для обработки запросов без расширений в интегрированном режиме. Это перенаправляет запрос в механизм маршрутизации, чтобы решить, как обрабатывать эти запросы. Больше информации
System.Web.Handlers.WebAdminHandler
рукоятки WebAdmin.axd
отображать ASP.NET Website Administration Toolkit
, вы можете удалить это, если вы не используете эту встроенную функцию.
System.Web.HttpForbiddenHandler
Позволяет нам запретить доступ к любым файлам с определенными расширениями. Однако он возвращает HTTP-статус 500 и фактически генерирует исключение System.Web.HttpException на сервере. На мой взгляд, есть лучшие способы для блога определенных расширений, таких как фильтрация запросов IIS.
System.Web.HttpMethodNotAllowedHandler
Я думаю, что этот больше не используется в современном IIS, он возвращает статус HTTP 405, а также выдает и HttpException
System.Web.HttpNotFoundHandler
Кроме того, больше не в моей текущей конфигурации. Выдает исключение 404 HTTP.
System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions
рукоятки *.asmx
а также *_AppService.axd
для поддержки вызовов веб-сервисов через Ajax.
System.Web.Services.Protocols.WebServiceHandlerFactory, System.Web.Services
Также ручки *.asmx
Запросы веб-сервисов в интегрированном режиме для DOT.NET 2
System.Web.StaticFileHandler
Возвращает статический файл, больше не используется?
System.Web.UI.PageHandlerFactory
Обрабатывает страницы ASP.NET WebForm .aspx
в интегрированном режиме.
System.Web.UI.SimpleHandlerFactory
Обрабатывает пользовательские обработчики ASP.NET .ashx
в интегрированном режиме.
System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting
Обрабатывает службы Windows Workflow Foundation .xamlx
в интегрированном режиме.
больше обработчиков:
модули ="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
Обычно это самое последнее отображение для обработки любых запросов, которые не были обработаны ни одним из предыдущих дескрипторов. path="*" verb="*"
, На самом деле он использует три разных модуля. StaticFileMode one ищет физический файл, соответствующий запрошенному URL-адресу, если он не найден, DefaultDocumentModule ищет документ по умолчанию в той же папке, что и запрошенный URL-адрес, и, если он также не найден, DirectoryListingModule может отображать содержимое каталога, если включен.
модули ="ProtocolSupportModule"
Это обрабатывает все запросы для HTTP-глаголов TRACE
а также OPTIONS
, если вы удалите это отображение, все запросы трассировки и опций будут возвращать "метод 405 не разрешен"
Опять же, не точный ответ, но некоторая очень полезная информация (imo): https://msdn.microsoft.com/en-us/library/ms972953.aspx
На прошлой неделе я задавал тот же вопрос, и после долгих исследований я думаю, что нашел что-то похожее на GitHub:
Список «небезопасных обработчиков»: https://gist.github.com/marcbarry/47644b4a43fbfb63ef54 .
Ответ на это
Где я могу получить список того, что делают все стандартные обработчики IIS HTTP?
Откройте IIS, CMD->inetmgr, затем щелкните сопоставления обработчиков, см. Скриншот ниже.
Нажмите, чтобы показать все включенные по умолчанию обработчики HTTP для этого веб-сервера.
Примечание. Если вы выберете виртуальный каталог, а затем выполните этот процесс, то есть щелкните сопоставления обработчика и удалите одно из сопоставлений, он добавит эту строку в файл web.config.
Например, я удалил aspq-ISAPI-4.0_64bit
так оно и изменилось web.config
для этого виртуального каталога, то есть он добавил следующую строку в web.config.
<remove name="aspq-ISAPI-4.0_64bit" />
под system.webServer\handlers
,
Обновление: эти обработчики вызываются, когда поступает конкретный запрос типа файла, до тех пор, пока он не будет простаивать. Таким образом, не будет никаких проблем с производительностью для этих обработчиков.
Пример того, что у вас есть removing handler for *.axd will improve security
Мой ответ на это, некоторые DLL могут понадобиться эти файлы для рендеринга js и css, и если вы удалите это, это не будет работать. Например, обработчик HTTP не может найти файл axd во вложенной папке веб-приложения: Telerik RadScriptManager не может найти файл WebResource.axd в папке ~/admin/