请求筛选 <requestFiltering>
概述
请求筛选是 Internet Information Services (IIS) 7.0 中引入的内置安全功能,很大程度上取代了之前 IIS 6.0 通过 UrlScan 加载项而实现的大部分功能。 请求筛选功能的所有设置都位于 <requestFiltering>
元素内,其中包含以下每个功能区域的多个子元素:
<denyUrlSequences>
- 此元素可以包含 IIS 7 将拒绝的 URL 序列模式的集合。例如:您可以拒绝攻击者可能尝试利用的部分 URL 序列。<fileExtensions>
- 此元素可以包含 IIS 7 拒绝或允许的文件扩展名集合。例如:您可以阻止对 Web.config 文件的所有请求。<hiddenSegments>
- 此元素可以包含无法浏览的 URL 的集合。例如:您可以拒绝对 ASP.NET App_Code 文件夹的请求。<requestLimits>
- 此元素包含 URL、内容和查询字符串长度的设置。 此元素还可以包含 HTTP 标头的用户定义最大长度的集合。<verbs>
- 此元素可以包含 IIS 7 将拒绝或允许的 HTTP 谓词的集合;例如:可以阻止所有 HTTP TRACE 请求。
IIS 7.5 中的新增功能
IIS 7.5 针对请求筛选增加了若干额外的功能区域:
<alwaysAllowedUrls>
- 此元素可以包含请求筛选始终允许的 URL 集合。<alwaysAllowedQueryStrings>
-此元素可以包含请求筛选始终允许的查询字符串集合。<denyQueryStringSequences>
- 此元素可以包含请求筛选将始终拒绝的查询字符串序列的集合。 使用此元素,管理员可以阻止其检测到的潜在危险的查询字符串序列。<filteringRules>
- 此元素可以包含自定义请求筛选规则的集合。 使用此集合,管理员可以针对特定条件创建自定义请求筛选规则。
IIS 10.0 中的新增功能
IIS 10.0 增加了 removeServerHeader
属性,可用于禁止向远程客户端发送 HTTP 服务器标头。
HTTP 404 错误子状态代码
当请求筛选阻止 HTTP 请求时,IIS 7 将向客户端返回 HTTP 404 错误,并记录 HTTP 唯一子状态,以确定拒绝请求的原因。 例如:
HTTP 子状态 | 说明 |
---|---|
404.5 |
URL 序列被拒绝 |
404.6 |
谓词被拒绝 |
404.7 |
文件扩展名被拒绝 |
404.8 |
隐藏命名空间 |
404.11 |
URL 双转义 |
404.12 |
URL 具有高位字符 |
404.14 |
URL 太长 |
404.15 |
查询字符串太长 |
404.18 |
查询字符串序列被拒绝 |
404.19 |
筛选规则拒绝 |
413.1 |
内容长度过大 |
431 |
请求标头过长 |
这些子状态允许 Web 管理员分析其 IIS 日志并识别潜在威胁。
兼容性
版本 | 说明 |
---|---|
IIS 10.0 | 在 IIS 10.0 中增加了禁止服务器标头的功能。 |
IIS 8.5 | <requestFiltering> 元素在 IIS 8.5 中未进行修改。 |
IIS 8.0 | <requestFiltering> 元素在 IIS 8.0 中未进行修改。 |
IIS 7.5 | 在 IIS 7.5 中,请求筛选附带 unescapeQueryString 属性以及 alwaysAllowedUrls 、alwaysAllowedQueryStrings 、和 denyQueryStringSequences filteringRules 元素。 这些元素作为 IIS 7.0 的更新引入,可通过 Microsoft 知识库文章 957508 (https://support.microsoft.com/kb/957508 ) 获取。 |
IIS 7.0 | <requestFiltering> 元素是在 IIS 7.0 中引入的。 |
IIS 6.0 | <requestFiltering> 元素取代了 IIS 6.0 的 UrlScan 功能。 |
安装
IIS 7 及更高版本的默认安装包括请求筛选角色服务或功能。 如果卸载请求筛选角色服务或功能,可以使用以下步骤重新安装它。
Windows Server 2012 或 Windows Server 2012 R2
- 在任务栏上,单击 “服务器管理器”。
- 在“服务器管理器”中,单击“管理”菜单,然后单击“添加角色和功能”。
- 在“添加角色和功能”向导中,单击“下一步”。 选择安装类型,然后单击“下一步”。 选择目标服务器,然后单击“下一步”。
- 在“服务器角色”页上,依次展开“Web 服务器 (IIS)”、“Web 服务器”和“安全性”,然后选择“请求筛选”。 单击 “下一步” 。
。
- 在“选择功能”页上,单击“下一步”。
- 在“确认安装选择”页上,单击“安装”。
- 在“结果” 页面中单击“关闭” 。
Windows 8 或 Windows 8.1
- 在“开始”屏幕上,将指针一直移动到左下角,右键单击“开始”按钮,然后单击“控制面板”。
- 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
- 依次展开“Internet Information Services”、“万维网服务”和“安全性”,然后选择“请求筛选”。
- 单击“确定”。
- 单击“关闭” 。
Windows Server 2008 或 Windows Server 2008 R2
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“服务器管理器”。
- 在“服务器管理器”层次结构窗格中,展开“角色”,然后单击“Web 服务器(IIS)”。
- 在“Web 服务器(IIS)”窗格中,滚动到“角色服务”部分,然后单击“添加角色服务”。
- 在“添加角色服务向导”的“选择角色服务”页上,选择“请求筛选”,然后单击“下一步”。
- 在“确认安装选择”页中,单击“安装”。
- 在“结果” 页面中单击“关闭” 。
Windows Vista 或 Windows 7
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
- 扩展“Internet Information Services”,展开“万维网服务”,然后展开“安全性”。
- 选择“请求筛选”,然后单击“确定”。
操作方式
IIS 7.0 用户请注意:本节中的某些步骤可能需要安装 Microsoft Administration Pack for IIS 7.0,其中包括请求筛选用户界面。 若要安装 Microsoft Administration Pack for IIS 7.0,请参阅以下 URL:
如何编辑请求筛选功能设置和请求限制
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
在“连接”窗格中,转到要为其修改请求筛选设置的连接、站点、应用程序或目录。
-
- 指定 2048,可将最大 URL 长度更改为 2KB。
- 指定 1024 可将最大查询字符串长度更改为 1KB。
- 清除“允许未列出的谓词”复选框可拒绝对未列出的 HTTP 谓词 的访问。
如何拒绝 URL 序列
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
在“连接”窗格中,转到要为其修改请求筛选设置的连接、站点、应用程序或目录。
在“添加拒绝序列”对话框中,输入要阻止的 URL 序列,然后单击“确定”。
例如,若要防止服务器上的目录遍历,将在对话框中输入两个句点 ("..")。
如何拒绝对特定文件扩展名的访问
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
在“连接”窗格中,转到要为其修改请求筛选设置的连接、站点、应用程序或目录。
在“拒绝文件扩展名”对话框中,输入要阻止的文件扩展名,然后单击“确定”。
例如,若要防止访问文件扩展名为 .inc 的文件,请在对话框中输入“inc”。
如何添加隐藏段
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
在“连接”窗格中,转到要为其修改请求筛选设置的连接、站点、应用程序或目录。
如何为 HTTP 标头添加限制
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
在“连接”窗格中,转到要为其修改请求筛选设置的连接、站点、应用程序或目录。
在“添加标头”对话框中,输入 HTTP 标头和标头限制所需的最大大小,然后单击“确定”。
例如,“Content-type”标头包含请求的 MIME 类型。 将值指定为 100 会将内容类型标头的长度限制为 100 个字节。
如何拒绝 HTTP 谓词
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
在“连接”窗格中,转到要为其修改请求筛选设置的连接、站点、应用程序或目录。
在“拒绝谓词”对话框中,输入要阻止的 HTTP 谓词,然后单击“确定”。
例如,要防止向服务器发出 HTTP TRACE 请求,请在对话框中输入“TRACE”。
配置
特性
属性 | 说明 |
---|---|
allowDoubleEscaping |
可选布尔属性。 如果设置为 true,则请求筛选将允许包含双转义字符的 URL。 如果设置为 false,则如果 URL 中存在两次转义的字符,请求筛选将拒绝请求。 默认值为 false 。 |
allowHighBitCharacters |
可选布尔属性。 如果设置为 true,请求筛选将允许在 URL 中包含非 ASCII 字符。 如果设置为 false,则如果 URL 中存在高位字符,请求筛选将拒绝请求。 默认值为 true 。 |
removeServerHeader |
可选布尔属性。 如果设置为 true,请求筛选将禁止 IIS 服务器标头。 如果设置为 false,IIS 将返回默认服务器标头。 (注意:此属性是在 IIS 10.0 中新增的,在 Windows Server 版本 1709 或 Windows 10 版本 1709 之前的 Windows 版本中无效。) 默认值为 false 。 |
unescapeQueryString |
可选布尔属性。 如果设置为 true,则请求筛选将对每个查询字符串扫描执行两轮扫描。 第一轮将扫描原始查询字符串,第二轮将在 IIS 解码所有转义序列后扫描查询字符串。 如果设置为 false,请求筛选将仅查看客户端发送的原始查询字符串。 注:IIS 7.5 中添加了此属性。 默认值为 true 。 |
子元素
元素 | 说明 |
---|---|
alwaysAllowedQueryStrings |
可选元素。 指定请求筛选始终允许的查询字符串集合。 注意:IIS 7.5 中添加了此元素。 |
alwaysAllowedUrls |
可选元素。 指定请求筛选始终允许的 URL 集合。 注意:IIS 7.5 中添加了此元素。 |
denyQueryStringSequences |
可选元素。 指定请求筛选将始终拒绝的查询字符串序列的集合。 注意:IIS 7.5 中添加了此元素。 |
denyUrlSequences |
可选元素。 指定应拒绝的序列,这有助于阻止对 Web 服务器发起的基于 URL 的攻击。 |
fileExtensions |
可选元素。 指定允许或拒绝哪些文件扩展名,以限制发送到 Web 服务器的请求类型。 |
filteringRules |
可选元素。 指定自定义请求筛选规则的集合。 注意:IIS 7.5 中添加了此元素。 |
hiddenSegments |
可选元素。 指定某些 URL 段可以拒绝客户端的访问。 |
requestLimits |
可选元素。 指定对 Web 服务器处理的请求的限制。 |
verbs |
可选元素。 指定允许或拒绝哪些 HTTP 谓词,以限制发送到 Web 服务器的请求类型。 |
配置示例
Web.config 文件中的以下配置示例可执行多个与安全相关的任务:
- 拒绝访问两个 URL 序列。 第一个序列可阻止目录遍历,第二个序列可阻止访问备用数据流。
- 拒绝访问未列出的文件扩展名和未列出的 HTTP 谓词。
- 将 URL 的最大长度设置为 2KB,并将查询字符串的最大长度设置为 1KB。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence=".." />
<add sequence=":" />
</denyUrlSequences>
<fileExtensions allowUnlisted="false" />
<requestLimits maxUrl="2048" maxQueryString="1024" />
<verbs allowUnlisted="false" />
</requestFiltering>
</security>
</system.webServer>
</configuration>
代码示例
下面的代码示例演示如何拒绝对默认网站的三个 URL 序列的访问:目录遍历 ("..")、备用数据流 (":") 和反斜杠 ("")。
AppCmd.exe
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence='..']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence=':']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence='\']"
PowerShell
Start-IISCommitDelay
$denyUrlSequences = Get-IISConfigSection -CommitPath 'Default Web Site' -SectionPath 'system.webServer/security/requestFiltering' | Get-IISConfigCollection -CollectionName 'denyUrlSequences'
New-IISConfigCollectionElement -ConfigCollection $denyUrlSequences -ConfigAttribute @{ 'sequence' = '..' }
New-IISConfigCollectionElement -ConfigCollection $denyUrlSequences -ConfigAttribute @{ 'sequence' = ':' }
New-IISConfigCollectionElement -ConfigCollection $denyUrlSequences -ConfigAttribute @{ 'sequence' = '\' }
Stop-IISCommitDelay
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetWebConfiguration("Default Web Site");
ConfigurationSection requestFilteringSection = config.GetSection("system.webServer/security/requestFiltering");
ConfigurationElementCollection denyUrlSequencesCollection = requestFilteringSection.GetCollection("denyUrlSequences");
ConfigurationElement addElement = denyUrlSequencesCollection.CreateElement("add");
addElement["sequence"] = @"..";
denyUrlSequencesCollection.Add(addElement);
ConfigurationElement addElement1 = denyUrlSequencesCollection.CreateElement("add");
addElement1["sequence"] = @":";
denyUrlSequencesCollection.Add(addElement1);
ConfigurationElement addElement2 = denyUrlSequencesCollection.CreateElement("add");
addElement2["sequence"] = @"\";
denyUrlSequencesCollection.Add(addElement2);
serverManager.CommitChanges();
}
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
Dim requestFilteringSection As ConfigurationSection = config.GetSection("system.webServer/security/requestFiltering")
Dim denyUrlSequencesCollection As ConfigurationElementCollection = requestFilteringSection.GetCollection("denyUrlSequences")
Dim addElement As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
addElement("sequence") = ".."
denyUrlSequencesCollection.Add(addElement)
Dim addElement1 As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
addElement1("sequence") = ":"
denyUrlSequencesCollection.Add(addElement1)
Dim addElement2 As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
addElement2("sequence") = "\"
denyUrlSequencesCollection.Add(addElement2)
serverManager.CommitChanges()
End Sub
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";
var requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var denyUrlSequencesCollection = requestFilteringSection.ChildElements.Item("denyUrlSequences").Collection;
var addElement = denyUrlSequencesCollection.CreateNewElement("add");
addElement.Properties.Item("sequence").Value = "..";
denyUrlSequencesCollection.AddElement(addElement);
var addElement1 = denyUrlSequencesCollection.CreateNewElement("add");
addElement1.Properties.Item("sequence").Value = ":";
denyUrlSequencesCollection.AddElement(addElement1);
var addElement2 = denyUrlSequencesCollection.CreateNewElement("add");
addElement2.Properties.Item("sequence").Value = "\\";
denyUrlSequencesCollection.AddElement(addElement2);
adminManager.CommitChanges();
VBScript
Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"
Set requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set denyUrlSequencesCollection = requestFilteringSection.ChildElements.Item("denyUrlSequences").Collection
Set addElement = denyUrlSequencesCollection.CreateNewElement("add")
addElement.Properties.Item("sequence").Value = ".."
denyUrlSequencesCollection.AddElement(addElement)
Set addElement1 = denyUrlSequencesCollection.CreateNewElement("add")
addElement1.Properties.Item("sequence").Value = ":"
denyUrlSequencesCollection.AddElement(addElement1)
Set addElement2 = denyUrlSequencesCollection.CreateNewElement("add")
addElement2.Properties.Item("sequence").Value = "\"
denyUrlSequencesCollection.AddElement(addElement2)
adminManager.CommitChanges()