Как метод HTTP OPTIONS определяет разрешенные методы в IIS 8.5?

8

Я пытаюсь удалить 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включен. Я знаю, что это не правильно, но это критерии, которым я должен соответствовать.

Есть ли способ получить ОПЦИИ для правильного сообщения о доступных методах?

alergy
источник

Ответы:

6

Интересный вопрос. Все методы , чтобы удалить 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, который я использовал выше.

Питер Хандорф
источник
спасибо за ответ, мне было интересно, нужно ли заменять обработчик OPTIONS, ваш ответ дает мне путь для решения этой проблемы.
настороже