Назад | Перейти на главную страницу

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

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