我希望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,但无法退出。我不想拒绝。TRACE
Allow
Public
TRACE
OPTIONS
OPTIONS
这是有问题的,因为我们遵守的合规性扫描似乎使用已启用OPTIONS
作为其指标TRACE
。我知道这是不正确的,但这是我必须满足的标准。
有什么方法可以让 OPTIONS 正确报告可用的方法吗?
答案1
有趣的问题。从 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
并搜索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。GET
POST
如果您只想使用这些标头进行OPTIONS
请求,您可以编写一个简单的 http 模块来设置这些标头并使用它来代替我上面使用的 StaticFileModule。