IIS: Как отключить HTTP-метод TRACE?
Я последовал за этим, что привело к тому, что я попытался отключить мой сайт от принятия метода TRACE (глагол). В основном я добавил раздел ниже, чтобы <system.webServer>
внутри Web.config (веб-сайт по умолчанию и другой веб-сайт):
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="TRACE" allowed="false" />
</verbs>
</requestFiltering>
</security>
Это не сработало. Затем я зашел в C:\Windows\System32\inetsrv\config\applicationHost.config и заменил глагол всех обработчиков внутри <handlers>
, В двух словах, все такие строки:
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
Стало это:
<add name="StaticFile" path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
Я даже перезапустил сервер, но когда я проверяю доступные методы, TRACE все еще там:
$ curl -I -X OPTIONS https://example.com/mysite
HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST
X-XSS-Protection: 1; mode=block
Date: Thu, 07 Feb 2019 21:03:49 GMT
Content-Length: 0
Итак, как мне избавиться от этого?
1 ответ
Чтобы действительно заблокировать TRACE
запросы, вы все равно должны сохранять правило фильтрации запросов с TRACE
глагол заблокирован.
Команда curl отправляет запрос OPTIONS в IIS, и ProtocolSupportModule
генерирует ответное сообщение,
https://docs.microsoft.com/en-us/iis/get-started/introduction-to-iis/iis-modules-overview
Однако Microsoft не разработала никаких настроек в system.webServer/httpProtocol
раздел для вас, чтобы изменить значение заголовков, чтобы скрыть TRACE
оттуда.
Но обходной путь заключается в использовании модуля перезаписи URL,
где вы создаете два исходящих правила для Allow
а также Public
заголовки,
<rewrite>
<outboundRules>
<rule name="ChangeHeaders" stopProcessing="false">
<match serverVariable="RESPONSE_Allow" pattern="OPTIONS, TRACE, GET, HEAD, POST" />
<action type="Rewrite" value="OPTIONS, GET, HEAD, POST" />
</rule>
<rule name="Public">
<match serverVariable="RESPONSE_Public" pattern="OPTIONS, TRACE, GET, HEAD, POST" />
<action type="Rewrite" value="OPTIONS, GET, HEAD, POST" />
</rule>
</outboundRules>
</rewrite>
В моем случае работает:
<requestFiltering>
<verbs allowUnlisted="false">
<clear/>
<add verb="GET" allowed="true" />
<add verb="HEAD" allowed="true" />
<add verb="POST" allowed="true" />
</verbs>
</requestFiltering>
Обратите внимание, что я не разрешаю ОПЦИИ. Когда я не разрешаю OPTIONS, то TRACE также не допускается.