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

Modified on: Sat, 09 Nov 2019 04:40:02 +0800

我想从IIS 8.5(Windows Server 2012 R2 Datacenter)中的网站中删除TRACE方法。我使用请求过滤实现了这一点,如下所示:

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

这可以防止TRACE请求,但如果我发送OPTIONS请求,它仍会在TRACE

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

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

作者:alergy

最佳答案

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

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

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

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

如果我们删除该模块,服务器不再响应Options请求,您仍然需要支持,所以我们必须使用另一个模块来回答这些问题。

打开:

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

并搜索OPTIONSVerbHandler注释该行,当你在上面时(TRACEVerbHandler)也是如此。现在添加一个新节点:

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

整个区块应如下所示:

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

现在,staticFileModule将处理OPTIONS请求,但不会返回任何内容。

如果您现在向服务器发出OPTIONS请求,您将无法获得AllowPublic标头,您可以轻松添加它们在web.config中

&lt;system.webServer&gt; &lt;httpProtocol&gt; &lt;customHeaders&gt; &lt;add name="Allow" value="GET,POST,HEAD" /&gt; &lt;add name="Public" value="GET,POST,HEAD" /&gt; &lt;/customHeaders&gt; &lt;/httpProtocol&gt; &lt;/system.webServer&gt;

现在您的OPTIONS请求按要求工作,但这些额外的标头也会随着我认为仍然存在的任何GETPOST请求一起发送有效的http。

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


相关问答

添加新评论