Como o método HTTP OPTIONS determina os métodos permitidos no IIS 8.5?

8

Estou procurando remover o TRACEmétodo do meu site no IIS 8.5 (Windows Server 2012 R2 Datacenter). Eu implementei isso usando a filtragem de solicitação, como abaixo:

<system.webServer>
  <security>
    <requestFiltering>
      <verbs allowUnlisted="true">
        <add verb="TRACE" allowed="false" />
      </verbs>
    </requestFiltering>
  </security>
</system.webServer>

Isso evita TRACEsolicitações, mas se eu enviar uma OPTIONSsolicitação, ela ainda será listada TRACEnos cabeçalhos Allowe Public. Redefini o IIS, mas não consigo TRACEsair OPTIONS. Eu não quero negar OPTIONS.

Isso é problemático porque parece que uma varredura de conformidade é adotada por nós OPTIONScomo indicador TRACEativado. Sei que isso não está correto, mas esse é o critério que tenho que atender.

Existe alguma maneira de fazer com que o OPTIONS relate os métodos disponíveis corretamente?

alergia
fonte

Respostas:

6

Pergunta interessante. Todos os métodos para remover response headersdo IIS parecem não funcionar para os cabeçalhos Allowe Public, uma OPTIONSsolicitação sempre retorna:

Allow:  OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST

independentemente do que o servidor realmente permita.

Todas as solicitações no IIS são tratadas por módulos, as OPTIONSsolicitações são tratadas pelo ProtocolSupportModuleque não é essencial e, como parece bastante idiota.

Se removermos esse módulo, o servidor não responderá mais à solicitação de Opções, que você ainda deseja oferecer suporte, portanto, precisamos usar outro módulo para respondê-las.

Aberto:

%SystemRoot%\System32\inetsrv\config\applicationHost.config

e pesquise o OPTIONSVerbHandlercomentário dessa linha e enquanto estiver nela, também a acima ( TRACEVerbHandler). Agora adicione um novo nó:

<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />

o bloco inteiro deve ficar assim:

    <!--  <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" /> 

Agora o staticFileModule processará as OPTIONSsolicitações, mas não retornará nenhum conteúdo.

Se você agora fizer uma OPTIONSsolicitação ao servidor, não receberá Allowum Publiccabeçalho nem um cabeçalho, poderá adicioná-los facilmente no web.config

<system.webServer>
 <httpProtocol>
      <customHeaders>
          <add name="Allow"  value="GET,POST,HEAD" />  
          <add name="Public" value="GET,POST,HEAD" />
      </customHeaders>
  </httpProtocol>        
</system.webServer>

agora suas OPTIONSsolicitações funcionam conforme necessário, mas esses cabeçalhos extras também são enviados com solicitações GETou POSTque eu acho que ainda são http válidas.

Se você quiser usar esses cabeçalhos apenas para OPTIONSsolicitações, poderá escrever um módulo http simples que defina esses cabeçalhos e use-o em vez do StaticFileModule que usei acima.

Peter Hahndorf
fonte
obrigado pela resposta, eu me perguntava se o manipulador de OPTIONS precisava ser substituído, sua resposta me fornece uma rota para lidar com isso.
Alergy