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

ale*_*rgy 8 iis iis-8.5

我希望TRACE从 IIS 8.5(Windows Server 2012 R2 数据中心)中的网站中删除该方法。我已经使用请求过滤实现了这一点,如下所示:

<system.webServer>
  <security>
    <requestFiltering>
      <verbs allowUnlisted="true">
        <add verb="TRACE" allowed="false" />
      </verbs>
    </requestFiltering>
  </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

这会阻止TRACE请求,但如果我发送OPTIONS请求,它仍会TRACEAllowPublic标头中列出。我已重置 IIS,但无法TRACE退出OPTIONS. 我不想否认OPTIONS

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

有没有办法让 OPTIONS 正确报告可用方法?

Pet*_*orf 6

有趣的问题。response headers从 IIS 中删除的所有方法似乎都不适用于AllowPublic标头,OPTIONS请求总是返回:

Allow:  OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST
Run Code Online (Sandbox Code Playgroud)

无论服务器实际允许什么。

IIS 中的所有请求都由模块处理,OPTIONS请求由 处理,ProtocolSupportModule这不是必需的,而且看起来很愚蠢。

如果我们删除该模块,服务器将不再响应 Options 请求,您仍然希望支持该请求,因此我们必须使用另一个模块来回答这些请求。

打开:

%SystemRoot%\System32\inetsrv\config\applicationHost.config
Run Code Online (Sandbox Code Playgroud)

并搜索OPTIONSVerbHandler该行的注释,同时搜索上面的 ( TRACEVerbHandler) 行。现在添加一个新节点:

<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />
Run Code Online (Sandbox Code Playgroud)

整个块应该是这样的:

    <!--  <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" /> 
Run Code Online (Sandbox Code Playgroud)

现在 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>
Run Code Online (Sandbox Code Playgroud)

现在您的OPTIONS要求上班必须的,但这些额外的头也与任何发送GETPOST我认为这仍然是有效的http请求。

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