我在 IIS 7.5 中启用了请求过滤,并希望保持这种状态,但是,一个站点基本上只是某个内部 Java 应用程序的代理,我想禁用该站点的请求过滤。可以这样做吗?
答案1
您可以为顶级(服务器)启用请求过滤,然后<clear />
在 web.config 文件的各个部分中为您不想使用请求过滤的站点添加:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<clear />
</denyUrlSequences>
<fileExtensions allowUnlisted="true">
<clear />
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>
</configuration>
答案2
这是一个没有人建议过的不同方法,并且我已经确认它有效:您可以删除请求过滤模块,在网站级别。这才是真正实现该功能的方式。(在我的测试中,我已证明这样做确实会禁用通过请求过滤启用的特性。当然,做这样的事需要非常谨慎。更多内容请见此处末尾。)
您也可以删除模块A)在 IIS UI 中(转到站点的“模块”部分,在列表中找到 RequestFilteringModule 并单击右侧的“删除”)或b)在 web.config 中,为该模块添加一个“remove”元素。稍后会详细介绍。
但请注意,无论哪种情况,默认情况下,IIS 配置为(出于安全原因)不允许您删除此模块 - 但可以覆盖它。这是由 applicationhost.config 文件中的一行控制的,该行有一个元素:
<add name="RequestFilteringModule" type="" preCondition="" lockItem="true" />
位于以下元素内:
<location path="" overrideMode="Allow">
<system.webServer>
<modules>
假设您有权更改该文件(您应该始终非常小心地执行此操作),请将“true”更改为“false”。如果您尝试在网站的 IIS UI 中删除模块,则阻止该操作的错误将不再发生,并且模块将被删除。通过 UI 进行的删除将创建(或修改)该网站的 web.config 文件以至少包含以下元素:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<modules>
<remove name="RequestFilteringModule" />
</modules>
</system.webServer>
</configuration>
如果您愿意,您可以通过编辑站点的 web.config 手动完成此操作。编辑该文件时也请务必小心。如果站点已经有一个 web.config 文件,而您想要添加该模块的“删除”,则应先保存该文件的副本,然后再尝试进行此修改。然后,您需要小心地将这些元素折叠到现有文件中。(同样,如果您尝试手动进行此更改,您仍然必须设置lockitem="false"
上面讨论的元素,以允许删除操作正常进行。
在将此类更改保存到 web.config 后,您应该立即检查 IIS UI,方法是转到站点的模块部分,点击刷新按钮(IIS 右上角)或按 f5,以确认 a) 模块是否已被删除或 b) 由于您在更改 web.config 文件时出现错误而导致出现一些错误——在这种情况下,撤消更改或恢复到您所做的备份。
最后,任何考虑从 IIS 站点删除该模块(完全删除“请求过滤”)的人都应该仔细考虑。默认情况下,它确实添加了许多保护。我想这样做的一个原因是,当我的请求失败并显示 403 时。我无法轻易判断是什么原因造成的,我怀疑是请求过滤(尽管通常它会清楚地表明其在拒绝中的作用,至少如果请求是在本地发出的,而 IIS 错误默认设置为显示详细信息。)
无论如何,我确实实施了此删除,并且我再次确认了它应该拒绝的方面之一(与我创建的过滤规则“拒绝路径”匹配的请求)现在被允许,直到我放回模块。最后,它没有帮助我:403 原来是由于在 Windows 2008 上运行的浏览器使用 SSL3,而服务器(而不是 IIS)拒绝了 SSL3。吸取了教训。但它迫使我找到这个答案,如果 OP 仍在寻找它,我想分享它。
答案3
2022 年 12 月更新: 请看我在这里的回答后面添加的评论,该评论发布于我写完这个答案三年后.(然后看看我在这里提供的新答案反而。)
我很惊讶自 2012 年以来这里没有答案。IIS 中确实有删除过滤器的规定,但遗憾的是不使用 IIS UI(即便是我写这篇文章的时候,已经是 2019 年了)。相反,通过仔细编辑网站的 web.config 就可以轻松完成(或根据需要创建一个)。
简而言之,可以通过修改您找到的任何 isapiFilters 元素(或者根据需要添加一个元素,见下文)来删除过滤器,然后添加单行“remove”元素,命名要删除的过滤器。请注意过滤器名称区分大小写。
假设您有一个不带 isapiFilters 元素的 web.config,您可以将这些行添加到文件中(再次强调,如果您键入而不是复制/粘贴,请注意所有三行的大小写),这将删除名为 Bob 的过滤器:
<isapiFilters>
<remove name="Bob" />
</isapiFilters>
这将在 system.webServer 元素内部的某一级别中找到或放置,就像这里的其他答案所示的那样。
对于一些读者来说,这可能就是他们需要听到的全部内容。其他人可能需要更多的详细说明,我希望在一篇博客文章中介绍这一点,我会在写完后回到这里并添加其链接,其中包括:如果您没有 web.config,则需要的所有行,您在尝试此操作时可能会遇到哪些错误,以及如何更安全地实施此类更改的提示。