¿Cómo determina el método HTTP OPTIONS los métodos permitidos en IIS 8.5?

8

Estoy buscando eliminar el TRACEmétodo de mi sitio web en IIS 8.5 (Windows Server 2012 R2 Datacenter). He implementado esto usando el filtrado de solicitudes de la siguiente manera:

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

Esto evita las TRACEsolicitudes, pero si envío una OPTIONSsolicitud, aún aparece TRACEen los encabezados Allowy Public. He reiniciado IIS, pero no puedo TRACEsalir OPTIONS. No quiero negar OPTIONS.

Esto es problemático porque parece que un análisis de cumplimiento que cumplimos utiliza OPTIONScomo su indicador que TRACEestá habilitado. Sé que esto no es correcto, pero ese es el criterio que tengo que cumplir.

¿Hay alguna forma de obtener OPCIONES para informar correctamente los métodos disponibles?

alergia
fuente

Respuestas:

6

Interesante pregunta. Todos los métodos para eliminar response headersde IIS no parecen funcionar para los encabezados Allowy Public, OPTIONSsiempre se devuelve una solicitud:

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

independientemente de lo que el servidor realmente permita.

Todas las solicitudes en IIS son manejadas por módulos, las OPTIONSsolicitudes son manejadas por lo ProtocolSupportModuleque no es esencial y, como parece bastante tonto.

Si eliminamos ese módulo, el servidor ya no responde a la solicitud de Opciones, que aún desea admitir, por lo que tenemos que usar otro módulo para responderlas.

Abierto:

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

y busca OPTIONSVerbHandlercomentar esa línea y mientras estás en ella la de arriba ( TRACEVerbHandler) también. Ahora agregue un nuevo nodo:

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

todo el bloque debería verse así:

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

Ahora el staticFileModule procesará las OPTIONSsolicitudes pero no devolverá ningún contenido.

Si ahora realiza una OPTIONSsolicitud al servidor, no obtendrá Allowni un Publicencabezado, puede agregarlos fácilmente en web.config

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

ahora sus OPTIONSsolicitudes funcionan según lo requerido, pero esos encabezados adicionales también se envían con cualquiera GETo POSTsolicitudes que creo que aún son válidas http.

Si solo desea usar esos encabezados para las OPTIONSsolicitudes, puede escribir un módulo http simple que establezca estos encabezados y usarlo en lugar del StaticFileModule que utilicé anteriormente.

Peter Hahndorf
fuente
gracias por la respuesta, me preguntaba si el controlador OPTIONS necesitaba ser reemplazado, su respuesta me da una ruta para manejar esto.
alergia