HTTP OPTIONS 方法如何确定 IIS 8.5 中允许的方法?

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列出。我已重置 IIS,但无法退出。我不想拒绝。TRACEAllowPublicTRACEOPTIONSOPTIONS

这是有问题的,因为我们遵守的合规性扫描似乎使用已启用OPTIONS作为其指标TRACE。我知道这是不正确的,但这是我必须满足的标准。

有什么方法可以让 OPTIONS 正确报告可用的方法吗?

答案1

有趣的问题。从 IIS 中删除的所有方法response headers似乎都不适用于AllowPublic标头,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一起发送,我认为这些请求仍然是有效的 http。GETPOST

如果您只想使用这些标头进行OPTIONS请求,您可以编写一个简单的 http 模块来设置这些标头并使用它来代替我上面使用的 StaticFileModule。

相关内容