IIS 7.0 请求筛选和 URL 重写
IIS 7.0 及更高版本包含基于适用于 IIS 6.0 的 URLScan ISAPI 筛选器的请求筛选模块。 该模块可帮助你加强 Web 服务器的安全性。
IIS 团队还发布了一个 IIS 的附加 URL 重写模块,它为基于规则的 URL 操作提供功能。 尽管 URL 重写模块的主要用途是重写请求的 URL 路径,但重写模块也可以用作安全强制工具,帮助防止访问网站内容。
本文介绍这两个模块之间的差异,并提供有关如何选择以加强 Web 服务器安全性的指导。
IIS 请求处理管道中的请求筛选和 URL 重写
首先,请务必了解请求筛选模块和重写模块是如何插入 IIS 管道的。 下图展示了这两个模块的相对顺序:
请求筛选模块通过处理 BeginRequest 事件在请求处理管道的开头运行。 该模块会评估请求元数据,例如标头、查询字符串、内容长度等,以确定请求元数据是否与任何现有筛选器匹配。 如果存在匹配项,则该模块会生成 404(找不到文件)响应,然后绕过 IIS 管道的其余部分。
如果请求筛选模块未筛选请求,则请求会被传递到 IIS 管道中的下一个模块,这可能是 URL 重写模块。 URL 重写模块会根据重写规则评估请求。 如果规则导致了重定向,或发送了自定义响应或中止了请求,则重写模块会生成适当的响应,然后绕过 IIS 管道的其余部分。
请注意,请求筛选模块位于 URL 重写模块之前。 这是因为在 IIS 体系结构中,请求筛选模块被视为保护 Web 服务器免受恶意请求的守护程序组件。 URL 重写模块被视为基于服务器的 URL 操作组件,它适用于已由请求筛选模块筛选的 URL。 可以将 URL 重写视为基于服务器的应用程序逻辑,类似于也可以执行重写或重定向的 ASP.NET 应用程序。 请求筛选是第一道防线,而 URL 重写器可以是更特定于应用程序的第二道安全屏障。 有关详细信息,请参阅 IIS 网站上的博客文章“IIS7 的 URL 重写器和请求筛选模块之间的交互”。
请求筛选和 URL 重写之间的差异
请求筛选和 URL 重写之间的概念差异如下:
- 请求筛选专为安全方案设计和优化。
- URL 重写可以应用于广泛的方案,安全方案只是其中的一部分。
考虑到这一点,可以比较可用于安全方案的每个模块的功能。 应考虑以下类别:
- 筛选条件。 可以使用哪种输入来作出阻止请求的决定? 此外,可以使用哪些条件来表达请求-阻止逻辑?
- 请求-阻止操作。 当请求满足筛选条件时,可以执行哪些操作?
- 性能影响。 请求筛选和 URL 重写会如何影响 Web 服务器的性能?
筛选条件
下表列出了可能的筛选条件,并说明了每个模块如何支持它们。
条件 | 受请求筛选模块支持? | 受 URL 重写模块支持? |
---|---|---|
扫描请求的 URL 路径 | 是,使用子字符串搜索 | 是,使用正则表达式和通配符模式 |
检查 URL 长度 | 是 | 否 |
扫描查询字符串 | 否 | 是,使用正则表达式和通配符模式 |
检查查询字符串长度 | 是 | 否 |
检查 HTTP 谓词 | 是 | 是 |
检查请求内容长度 | 是 | 否 |
扫描 HTTP 头 | 否 | 是,使用正则表达式和通配符模式 |
检查 HTTP 头长度 | 是 | 否 |
扫描服务器变量 | 否 | 是 |
检查发件人的 IP 地址或主机名 | 否* | 是 |
* IIS 中的 IP 限制模块可用于阻止来自特定 IP 地址和主机名的请求。
请求-阻止操作
请求筛选模块只有一个操作,在请求与筛选条件匹配时执行。 该操作是返回状态代码 404(找不到文件)。
如果应阻止某个请求,则 URL 重写模块会提供更广泛的选项,包括:
- 请求的 URL 可以重写为其他 URL。 例如,为了防止图像热链接,可以为来自第三方域的任何请求重写占位符图像文件的 URL。
- Web 客户端可以重定向到其他 URL。
- 你选择的 HTTP 状态代码可以发送到 Web 客户端。 例如,可以针对符合特定筛选条件的请求发送状态 401(未授权)响应。
- 可以通过删除套接字连接来中止 HTTP 请求。 这样,Web 客户端就完全无法获取有关 Web 服务器的信息。
性能影响
这两个模块都已实现,以尽可能降低对 IIS Web 服务器性能的影响。 但是,这些模块之间存在以下重要的性能差异:
- URL 重写模块严重依赖于正则表达式模式。 计算正则表达式是一项昂贵的操作,如果定义了许多复杂的重写规则,则可能会明显影响 Web 服务器的吞吐量。
- 请求筛选模块不使用正则表达式或任何其他模式匹配。 它只执行子字符串搜索,这会显著减少对 Web 服务器吞吐量的影响。
在请求筛选和 URL 重写之间进行选择
如果要在请求筛选和 URL 重写之间进行选择以加强 Web 服务器的安全性,一般原则是从请求筛选开始。 请求筛选针对安全方案进行了优化,其功能集很可能足以满足安全要求的实现。 如果你有一个请求筛选模块无法解决的要求,请使用 URL 重写模块实现该要求,并将其余的安全任务留给请求筛选模块。 这样一来,可以让服务器处理最少量的重写规则,从而减少 URL 重写模块的性能影响。