Я хочу удалить TRACE
с моего веб-сайта в IIS 8.5 (Windows Server 2012 R2 Datacenter). Я реализовал это, используя фильтрацию запросов, как показано ниже:
<system.webServer>
<security>
<requestFiltering>
<verbs allowUnlisted="true">
<add verb="TRACE" allowed="false" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
Это предотвращает TRACE
запросов, но если я отправлю OPTIONS
запрос, он все еще перечисляет TRACE
в Allow
и Public
заголовки. Я сбросил IIS, но не могу получить TRACE
снаружи OPTIONS
. Я не хочу отрицать OPTIONS
.
Это проблематично, потому что кажется, что проверка соответствия, которую мы выполняем, использует OPTIONS
как индикатор того, что TRACE
включен. Я знаю, что это неправильно, но я должен соответствовать этим критериям.
Есть ли способ получить ОПЦИИ для правильного сообщения о доступных методах?
Интересный вопрос. Все способы удаления response headers
из IIS, похоже, не работают для Allow
и Public
заголовки, OPTIONS
запрос всегда возвращает:
Allow: OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST
независимо от того, что на самом деле позволяет сервер.
Все запросы в IIS обрабатываются модулями, OPTIONS
запросы обрабатываются ProtocolSupportModule
что несущественно и кажется довольно глупым.
Если мы удалим этот модуль, сервер больше не будет отвечать на запрос опций, который вы по-прежнему хотите поддерживать, поэтому нам придется использовать другой модуль, чтобы ответить на них.
Открыто:
%SystemRoot%\System32\inetsrv\config\applicationHost.config
и искать OPTIONSVerbHandler
прокомментируйте эту строку, и пока вы на ней, строку выше (TRACEVerbHandler
) также. Теперь добавим новый узел:
<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />
весь блок должен выглядеть так:
<!-- <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" /> -->
<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />
Теперь staticFileModule обработает OPTIONS
запросы, но он не вернет никакого контента.
Если вы сейчас сделаете OPTIONS
запрос к серверу, вы не получите Allow
ни Public
заголовок, вы можете легко добавить их в web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Allow" value="GET,POST,HEAD" />
<add name="Public" value="GET,POST,HEAD" />
</customHeaders>
</httpProtocol>
</system.webServer>
теперь твой OPTIONS
запросы работают по мере необходимости, но эти дополнительные заголовки также отправляются с любыми GET
или POST
запросы, которые, я думаю, все еще действительны http.
Если вы хотите использовать эти заголовки только для OPTIONS
Запросы, вы можете написать простой модуль http, который устанавливает эти заголовки и использовать его вместо StaticFileModule, который я использовал выше.