我正在从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请求,它仍然在Allow和Public标题中列出TRACE 。 我已经重置了IIS,但是无法从OPTIONS获取TRACE 。 我不想否认OPTIONS 。
这是有问题的,因为我们遵守的合规性扫描似乎使用OPTIONS作为TRACE启用的指标。 我知道这是不正确的,但这是我必须达到的标准。
有没有办法让选项正确报告可用的方法?
有趣的问题。 所有从IIS中删除response headers的方法似乎都不适用于Allow和Public头,一个OPTIONS请求总是返回:
Allow: OPTIONS, TRACE, GET, HEAD, POST Public: OPTIONS, TRACE, GET, HEAD, POST
无论服务器实际允许什么。
IIS中的所有请求都由模块处理, OPTIONS请求由ProtocolSupportModule处理,这不是必需的,因为它看起来很愚蠢。
如果我们删除这个模块,服务器不再响应选项请求,你仍然想支持,所以我们必须使用另一个模块来回答这些问题。
打开:
%SystemRoot%\System32\inetsrv\config\applicationHost.config
并searchOPTIONSVerbHandler注释行,同时你也在上面( 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请求按要求工作,但是这些额外的头文件也会被发送任何GET或POST请求,我认为这仍然是有效的http。
如果你只想为OPTIONS请求使用这些头文件,你可以编写一个简单的http模块来设置这些头文件,并使用它来代替上面使用的StaticFileModule。