在 IIS 中配置请求筛选

作者:Keith Newman 和 Robert McMurray

本文档向你显示了如何使用常见请求筛选器设置提高你的 IIS 8 Web 服务器的安全性。

请求筛选器可限制 IIS 8 处理的 HTTP 请求的类型。 通过阻止特定的 HTTP 请求,请求筛选器有助于防止具有潜在危害的请求到达服务器。 请求筛选器模块会根据所设置的规则扫描传入的请求并拒绝不需要的请求。

默认情况下,IIS 会拒绝要浏览关键代码段的请求。 它还拒绝对一些文件扩展名的请求。

你可以在服务器范围的级别上配置请求筛选器,然后覆盖网站级别上的配置。

先决条件

若要充分利用本教程,你必须具有对运行以下操作系统之一的计算机的访问权限:

  • Windows Server® 2012
  • Windows® 8

常规请求筛选器设置

常规设置包含如下设置:

  1. 是否允许访问扩展名未在请求筛选器中列出的文件。
  2. 是否允许使用未列出的 HTTP 谓词的请求。
  3. 是否允许包含高位字符(非 ASCII)的请求。
  4. 是否允许双编码的请求。
  5. 请求的内容的最大长度。
  6. URL 的最大长度。
  7. 查询字符串的最大大小。

使用 UI 配置常规请求筛选器选项

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. “操作”窗格中,单击“编辑功能设置”
  4. 在“编辑请求筛选设置”对话框中,根据需要编辑设置,然后单击“确定”。

使用命令行配置常规请求筛选器选项

配置高位字符

若要配置高位字符,请使用以下语法:

appcmd set config /section:requestfiltering /allowhighbitcharacters:true|false

例如,若要允许使用高位字符,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /allowhighbitcharacters:true

配置双重转义

若要配置双转义,请使用以下语法:

appcmd set config /section:requestfiltering /allowdoubleescaping:true|false

例如,若要启用双转义,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /allowdoubleescaping:true

配置允许的最大内容长度

若要配置内容的允许最大长度值,请使用以下语法:

appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:单位

requestlimits.maxallowedcontentlength:unit 变量指定内容的最大长度。

例如,若要将 30000000 指定为内容的最大长度,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:30000000

配置允许的最大 URL 长度

若要配置传入 URL 的允许最大长度值,请使用以下语法:

appcmd set config /section:requestfiltering /requestlimits.maxurl:单位

requestlimits.maxurl:unit 变量指定传入 URL 的最大长度。

例如,若要将 4096 指定为传入 URL 的最大长度,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /requestlimits.maxurl:4096

配置允许的最大查询字符串长度

若要配置传入查询字符串的允许最大长度值,请使用以下语法:

appcmd set config /section:requestfiltering /requestlimits.maxquerystring:单位

requestlimits.maxquertystring:unit 变量指定传入查询字符串的最大长度。

例如,若要将 2048 指定为传入查询字符串的最大长度,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /requestlimits.maxquerystring:2048

配置 HTTP 标头的最大大小

若要配置特定 HTTP 头的大小限制,使用以下语法:

appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='string',sizelimit='unit']

header=string 变量指定将应用此限制的标头。 sizelimit=unit 变量指定此标头的最大大小。

例如,若要将包含值 contoso.com 的标头的最大大小指定为 2048,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='contoso.com',sizelimit='2048']

文件扩展名

对于你添加的每个文件扩展名,你可以指示是允许还是拒绝针对该文件类型的请求。

使用 UI 配置文件扩展名

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择“文件扩展名”选项卡。
  4. 在“操作”窗格中,单击“允许文件扩展名”或“拒绝文件扩展名”。
  5. 在框中键入文件扩展名,然后单击“确定”。

使用命令行配置文件扩展名

配置未列出的文件扩展名

若要配置 IIS 处理未列出的文件扩展名的方式,请使用以下语法:

appcmd set config /section:requestfiltering /fileExtensions.allowunlisted:true|false

例如,若要拒绝未列出的文件扩展名,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /fileExtensions.allowunlisted:false

为 WebDAV 请求配置

若要配置是否对 WebDAV 请求应用文件扩展名,请使用以下语法:

appcmd set config /section:requestfiltering /fileExtensions.applyToWebDAV:true|false

例如,若要配置 IIS 以便不对 WebDAV 请求应用文件扩展名,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /fileExtensions.applyToWebDAV:false

添加或移除文件扩展名

若要添加文件扩展名,请使用以下语法:

appcmd set config /section:requestfiltering /+fileExtensions.[fileextension='字符串',allowed='true | false']

fileextension=string 变量表示你要允许或拒绝的文件扩展名。

例如,若要为文件扩展名 .xxx 添加允许规则,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /+fileExtensions.[fileextension='.xxx',allowed='true']

例如,删除文件扩展名 .xxx 的规则,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /-fileExtensions.[fileextension='.xxx']

筛选规则

IIS 8 允许你定义将应用于传入请求的自定义筛选器规则。 使用此功能,你可以定义可执行以下操作的筛选器:

  1. 扫描请求 URL。
  2. 扫描包含在 URL 中的查询字符串。
  3. 扫描特定标头字段。
  4. 定义筛选器将应用于的文件扩展名。
  5. 定义要拒绝的字符串。

使用 UI 配置筛选规则

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择 Rules 选项卡。
  4. 在“操作”窗格中,双击“添加筛选规则”。
  5. 在“名称”框中,键入筛选规则的名称。
  6. 如果要扫描 URL,请选中“扫描 URL”复选框。
  7. 如果要扫描查询字符串,请选中“扫描查询字符串”复选框。
  8. 在“扫描标头”下,键入一个或多个要扫描的标头。
  9. 在“应用于”下,键入一个或多个将应用规则的文件扩展名。
  10. 在“拒绝字符串”下,键入一个或多个要拒绝的字符串。
  11. 单击“确定”。

隐藏段

此功能允许你拒绝包含某个 URL 段(例如,文件夹名称)的请求。

使用 UI 配置隐藏段

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择“隐藏段”选项卡。
  4. 在“操作”窗格中,单击“添加隐藏段”
  5. 在框中键入 URL 段,然后单击“确定”。

使用命令行配置隐藏段

为 WebDAV 请求配置

若要配置是否对 WebDAV 请求应用隐藏段,请使用以下语法:

appcmd set config /section:requestfiltering /hiddensegments.applyToWebDAV:true|false

例如,若要配置 IIS 以便不对 WebDAV 请求应用隐藏段,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /hiddensegments.applyToWebDAV:false

添加隐藏段

若要配置隐藏段,使用以下语法:

appcmd set config /section:requestfiltering /+hiddensegments.[segment='字符串']

segment=string 变量指定将隐藏的 URL 段。

例如,若要指定 /bin 为隐藏段,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /+hiddensegments.[segment='/bin']

URL 筛选

你可以将 IIS 配置为接受指定的 URL。 此外,你可以将其配置为拒绝指定的 URL 序列。

使用 UI 配置 URL 筛选

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择“URL”选项卡。
  4. 在“操作”窗格中,选择“允许 URL”或“拒绝序列”。
  5. 在框中键入 URL 或 URL 序列,然后单击“确定”。

使用命令行配置 URL 筛选

若要拒绝 URL 序列,请使用以下语法:

appcmd set config /section:requestfiltering /+denyurlsequences.[sequence='字符串']

sequence=string 变量指定 URL 中从不允许 IIS 解析的字符序列。

例如,若要指定 IIS 从不解析包含两个句点的 URL,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /+denyurlsequences.[sequence='..']

HTTP 谓词

你可以定义一个谓词列表,IIS 8 将接受该列表作为请求的一部分。 当 IIS 基于此功能拒绝请求时,记录的错误代码为 404.6。

使用 UI 配置未列出的 HTTP 谓词

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择“HTTP 谓词”选项卡。
  4. 在“操作”窗格中,单击“允许谓词”或“拒绝谓词”。
  5. 在框中输入谓词,然后单击“确定”。

使用命令行配置未列出的 HTTP 谓词

配置未列出的 HTTP 谓词

若要配置 IIS 处理未列出的谓词的方式,请使用以下语法:

appcmd set config /section:requestfiltering /verbs.allowunlisted:true|false

例如,若要拒绝未列出的谓词,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /verbs.allowunlisted:false

为 WebDAV 请求配置

若要配置是否对 WebDAV 请求应用谓词筛选,请使用以下语法:

appcmd set config /section:requestfiltering /verbs.applyToWebDAV:true|false

例如,若要配置 IIS 以便不对 WebDAV 请求应用谓词筛选,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /verbs.applyToWebDAV:false

添加 HTTP 谓词

若要配置要筛选的谓词,请使用以下语法:

appcmd set config /section:requestfiltering /+verbs.[verb='string',allowed='true|false']

verb=string 变量用于指定将应用此限制的谓词。

例如,若要指定允许使用 GET,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /section:requestfiltering /+verbs.[verb='GET',allowed='true']

标头大小限制

你可以限制 HTTP 请求标头的大小以提升性能和安全性。 标头是定义 HTTP 事务操作参数的名称/值对。

使用 UI 配置标头大小限制

  1. 打开 IIS 管理器,然后选择要为其配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择“标头”选项卡,然后单击“添加标头”。
  4. 在“标头”框中,键入标头字段名称。
  5. 在“大小限制”框中,键入一个表示标头大小限制的正整数(以字节为单位)。
  6. 单击“确定”。

查询字符串

你可以将 IIS 8 配置为允许或拒绝所请求的 URL 中包含的特定查询字符串。 例如,如果在请求 URL 中发现拒绝的查询字符串,则将拒绝该请求。

使用 UI 配置查询字符串

  1. 打开 IIS 管理器,然后选择要配置请求筛选器的级别。
  2. 在“功能视图”中,双击“请求筛选”。
  3. 选择“查询字符串”选项卡,然后单击“允许查询字符串”或“拒绝查询字符串”。
  4. 在“查询字符串”框中,键入查询字符串。
  5. 单击“确定”。

请求筛选日志记录

你可以使用 IIS 日志记录来评估和优化你的请求筛选器配置。

下表显示了可在日志中看到的请求筛选器错误代码:

错误说明 状态代码
请求筛选:URL 序列被拒绝 404.5
请求筛选:谓词被拒绝 404.6
请求筛选:文件扩展名被拒绝 404.7
请求筛选:被隐藏段拒绝 404.8
请求筛选:由于 URL 双重转义而被拒绝 404.11
请求筛选:由于高位字符而被拒绝 404.12
请求筛选:由于 URL 太长而被拒绝 404.14
请求筛选:由于查询字符串太长而被拒绝 404.15
请求筛选:由于内容长度太大而被拒绝 413.1
请求筛选:由于请求头太长而被拒绝。 431

另请参阅