AWS WAF 中的请求组件
本部分将介绍您可以指定检查 Web 请求的哪些组件。您可以为在 Web 请求中查找模式的匹配规则语句指定请求组件。其中包括字符串匹配、正则表达式模式匹配、SQL 注入攻击和大小约束语句。有关如何使用这些请求组件设置的信息,请访问 在 AWS WAF 中使用匹配规则语句,参阅各个规则语句。
除非另有说明,否则,如果 Web 请求没有规则语句中指定的请求组件,则 AWS WAF 会将该请求评估为与规则条件不匹配。
注意
您可以为每个需要它的规则语句指定一个请求组件。要检查请求的多个组件,请为每个组件创建一条规则语句。
AWS WAF 控制台和 API 文档在以下位置提供有关请求组件设置的指南:
-
控制台上的规则生成器 – 在常规规则类型的语句设置中,在请求组件下的检查对话框中选择要检查的组件。
-
API 语句内容 –
FieldToMatch
本节的其余部分将介绍 Web 请求检查部分的选项。
主题
HTTP method
检查请求中的 HTTP 方法。HTTP 方法指示 Web 请求要求受保护的资源执行的操作的类型,如 POST
或 GET
。
单个标头
检查请求中的单个命名标头。
对于此选项,您可以指定标头名称,例如 User-Agent
或 Referer
。名称的字符串不区分大小写。
所有标头
检查所有请求标头,包括 Cookie。您可以应用筛选器来检查所有标头的子集。
对于此选项,您需要提供以下规范:
-
匹配模式 – 用于获取标头子集以供检查的筛选器。AWS WAF 在标头键中查找这些模式。
匹配模式设置可采用以下的一种设置:
-
全部 – 匹配所有键。评估所有标头的规则检查条件。
-
排除标头 – 仅检查其键与此处指定的任何字符串都不匹配的标头。键的字符串匹配不区分大小写。
-
包含标头 – 仅检查键与此处指定的字符串之一匹配的标头。键的字符串匹配不区分大小写。
-
-
匹配范围 – AWS WAF 应使用规则检查条件检查的标头部分。您可以指定键、值或全部来检查键和值是否匹配。
全部不需要在键中找到匹配项,也无需在值中找到匹配项。它需要在键或值中找到匹配项,或者两者兼有。如需要求在键和值中进行匹配,请使用逻辑
AND
语句组合两个匹配规则,一个检查键,另一个检查值。 -
超大处理 – AWS WAF 应如何处理标头数据大于 AWS WAF 的检查能力的请求。AWS WAF 最多可以检查请求标头的前 8 KB(8,192 字节),最多可以检查前 200 个标头。在达到第一个限制之前,内容可供 AWS WAF 检查。您可以选择继续检查,也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息,请参阅 在 AWS WAF 中处理超大 Web 请求组件。
标头顺序
检查包含请求标头名称列表的字符串,这些标头名称按它们在 AWS WAF 收到的以供检查的 Web 请求中显示的顺序排列。AWS WAF 生成字符串,然后将其用作字段来匹配检查中的组件。AWS WAF 用冒号分隔字符串中的标头名称,不添加空格,如 host:user-agent:accept:authorization:referer
。
对于此选项,您需要提供以下规范:
-
超大处理 – AWS WAF 应如何处理标头数据较多或较大,超出 AWS WAF 检查能力的请求。AWS WAF 最多可以检查请求标头的前 8 KB(8,192 字节),最多可以检查前 200 个标头。在达到第一个限制之前,内容可供 AWS WAF 检查。您可以选择继续检查可用标头,也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息,请参阅 在 AWS WAF 中处理超大 Web 请求组件。
Cookie
检查所有请求 Cookie。您可以应用筛选器来检查所有 Cookie 的子集。
对于此选项,您需要提供以下规范:
-
匹配模式 – 用于获取 Cookie 子集以供检查的筛选器。AWS WAF 在 Cookie 密钥中查找这些模式。
匹配模式设置可采用以下的一种设置:
-
全部 – 匹配所有键。评估所有 Cookie 的规则检查条件。
-
排除 Cookie – 仅检查其键与此处指定的任何字符串都不匹配的 Cookie。键的字符串匹配不区分大小写且必须精确。
-
包含 Cookie – 仅检查键与此处指定的字符串之一匹配的 Cookie。键的字符串匹配不区分大小写且必须精确。
-
-
匹配范围 – AWS WAF 应使用规则检查条件检查的 Cookie 部分。您可以为键和值指定键、值或全部。
全部不需要在键中找到匹配项,也无需在值中找到匹配项。它需要在键或值中找到匹配项,或者两者兼有。如需要求在键和值中进行匹配,请使用逻辑
AND
语句组合两个匹配规则,一个检查键,另一个检查值。 -
超大处理 – AWS WAF 应如何处理 Cookie 数据大于 AWS WAF 的检查能力的请求。AWS WAF 最多可以检查请求 Cookie 的前 8 KB(8,192 字节),最多可以检查前 200 个 Cookie。在达到第一个限制之前,内容可供 AWS WAF 检查。您可以选择继续检查,也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息,请参阅 在 AWS WAF 中处理超大 Web 请求组件。
URI 路径
检查 URL 中标识资源的部分(例如 /images/daily-ad.jpg
)。有关信息,请参阅统一资源标识符 (URI):一般语法
如果您未配合使用此选项和文本转换,AWS WAF 不会规范化 URI,并会按照在请求中从客户端接收它时的原样对其进行检查。有关文本转换的信息,请参阅 在 AWS WAF 中使用文本转换。
JA3 指纹
检查请求的 JA3 指纹。
注意
JA3 指纹检查仅适用于 Amazon CloudFront 分配和应用程序负载均衡器。
JA3 指纹是一个 32 字符的哈希值,源自传入请求的 TLS Client Hello。此指纹用作客户端 TLS 配置的唯一标识符。AWS WAF 会计算并记录每个请求的指纹,只要这些请求有足够的 TLS Client Hello 信息用于计算。几乎所有的 Web 请求都包含此信息。
如何获取客户端的 JA3 指纹
您可以从 Web ACL 日志中获取客户端请求的 JA3 指纹。AWS WAF 如果能够计算指纹,就会将其包含在日志中。有关日志记录字段的信息,请参阅 Web ACL 流量的日志字段。
规则语句要求
您只能在字符串匹配语句中检查 JA3 指纹,该语句设置为与您提供的字符串完全匹配。在字符串匹配语句规范中提供日志中的 JA3 指纹字符串,以便与今后任何具有相同 TLS 配置的请求相匹配。有关字符串匹配语句的信息,请参阅 字符串匹配规则语句。
您必须为此规则语句提供回退行为。如果 AWS WAF 无法计算 JA3 指纹,则回退行为是您希望 AWS WAF 分配给 Web 请求的匹配状态。如果您选择匹配,AWS WAF 会将 Web 请求视为与规则语句匹配,并将规则操作应用于请求。如果您选择不匹配,AWS WAF 会将 Web 请求视为与规则语句不匹配。
如需使用此匹配选项,必须记录您的 Web ACL 流量。有关信息,请参阅记录 AWS WAF Web ACL 流量。
查询字符串
检查 URL 中在 ?
字符之后出现的部分(如果有)。
注意
对于跨站点脚本匹配语句,我们建议您选择所有查询参数,而不是查询字符串。选择所有查询参数将在基本成本的基础上增加 10 个 WCU。
Single query parameter (单个查询参数)
检查您已定义为查询字符串的一部分的单个查询参数。AWS WAF 检查您指定的参数值。
对于此选项,您还可以指定一个查询参数。例如,如果 URL 为 www.xyz.com?UserName=abc&SalesRegion=seattle
,则可以为该查询参数指定 UserName
或 SalesRegion
。参数名称的长度上限是 30 个字符。名称不区分大小写,因此如果您指定 UserName
作为名称,AWS WAF 匹配 UserName
的所有变体,包括 username
和 UsERName
。
如果查询字符串包含您指定的查询参数的多个实例,AWS WAF 使用 OR 逻辑检查所有值中的匹配项。例如,在 URL www.xyz.com?SalesRegion=boston&SalesRegion=seattle
中,AWS WAF 根据 boston
和 seattle
评估您指定的名称。如果匹配其中任意一个,则检查匹配。
All query parameters (所有查询参数)
检查请求中的所有查询参数。这与单个查询参数组件选择类似,但 AWS WAF 会检查查询字符串中所有参数的值。例如,如果 URL 为 www.xyz.com?UserName=abc&SalesRegion=seattle
,并且如果 UserName
或 SalesRegion
的值与检查条件匹配,AWS WAF 则会触发匹配。
选择此选项会在基本成本的基础上增加 10 个 WCU。
Body
以纯文本形式检查请求正文。您也可以使用 JSON 内容类型将正文评估为 JSON。
请求正文紧跟在请求标头之后的请求部分。它包含 Web 请求所需的任何其他数据,例如,表单中的数据。
-
在控制台中,您可以在请求选项选择正文下选择此选项,方法是选择内容类型选择纯文本。
-
在 API 中,您可以在规则的
FieldToMatch
规范中指定Body
以纯文本形式检查请求正文。
对于应用程序负载均衡器和 AWS AppSync,AWS WAF 可以检查请求正文的前 8 KB 内容。对于 CloudFront、API Gateway、Amazon Cognito、App Runner 和 Verified Access,AWS WAF 默认检查前 16 KB,您可以在 Web ACL 配置中将此限制提高至 64 KB。有关更多信息,请参阅 管理 AWS WAF 的正文检查大小限制。
您必须为此组件类型指定超大尺寸处理。超大尺寸处理定义了 AWS WAF 如何处理主体数据大于 AWS WAF 检查能力的请求。您可以选择继续检查,也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息,请参阅 在 AWS WAF 中处理超大 Web 请求组件。
您也可以将正文评估为已解析的 JSON。有关信息,请参阅下面的部分。
JSON 正文
检查以 JSON 形式评估的请求正文。您还可以以纯文本形式评估正文。
请求正文紧跟在请求标头之后的请求部分。它包含 Web 请求所需的任何其他数据,例如,表单中的数据。
-
在控制台中,您可以在请求选项选择正文下选择此选项,方法是选择内容类型选择JSON。
-
在 API 中,您可以在规则的
FieldToMatch
规范中指定JsonBody
。
对于应用程序负载均衡器和 AWS AppSync,AWS WAF 可以检查请求正文的前 8 KB 内容。对于 CloudFront、API Gateway、Amazon Cognito、App Runner 和 Verified Access,AWS WAF 默认检查前 16 KB,您可以在 Web ACL 配置中将此限制提高至 64 KB。有关更多信息,请参阅 管理 AWS WAF 的正文检查大小限制。
您必须为此组件类型指定超大尺寸处理。超大尺寸处理定义了 AWS WAF 如何处理主体数据大于 AWS WAF 检查能力的请求。您可以选择继续检查,也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息,请参阅 在 AWS WAF 中处理超大 Web 请求组件。
选择此选项会使匹配语句的基本成本 WCU 翻倍。例如,如果在没有 JSON 解析的情况下,匹配语句的基本成本为 5 个 WCU,则使用 JSON 解析会将成本加倍到 10 个 WCU。
对于此选项,应提供其他规范,如以下部分所述。
AWS WAF 如何处理 JSON 正文检查
当 AWS WAF 检查 JSON 形式的 Web 请求正文时,它会执行相应步骤来解析正文并提取 JSON 元素进行检查。AWS WAF根据您的配置选项执行这些步骤。
下面列出了 AWS WAF 执行的步骤。
-
解析正文内容 - AWS WAF 解析 Web 请求正文的内容以提取 JSON 元素进行检查。AWS WAF 尽最大努力解析正文的全部内容,但是内容中的各种错误状态可能会导致解析失败。错误示例包括无效字符、重复键、截断以及其根节点不是对象或数组的内容。
正文解析后备行为选项确定 AWS WAF 无法完全解析 JSON 正文时该怎么做:
-
无(默认行为) – AWS WAF 仅在内容遇到解析错误之前对其进行评估。
-
以字符串形式评估 – 以纯文本形式检查正文。AWS WAF 将您为 JSON 检查定义的文本转换和检查条件应用于正文文本字符串。
-
匹配 – 将 Web 请求视为与规则语句匹配。AWS WAF 会将规则操作应用于请求。
-
不匹配 – 将 Web 请求视为与规则语句不匹配。
注意
只有 AWS WAF 在解析 JSON 字符串遇到错误时,才会触发此回退行为。
解析不能完全验证 JSON
AWS WAF 解析不能完全验证输入的 JSON 字符串,因此即使是无效的 JSON 也能解析成功。
例如,AWS WAF 解析了以下无效 JSON 而未出错:
-
缺少逗号:
{"key1":"value1""key2":"value2"}
-
缺少冒号:
{"key1":"value1","key2""value2"}
-
额外的冒号:
{"key1"::"value1","key2""value2"}
对于诸如解析成功但结果不是完全有效的 JSON 之类的情况,评估中的后续步骤结果可能会有所不同。提取可能会遗漏某些元素,或者规则评估可能会产生意外结果。我们建议验证在应用程序中收到的 JSON,并根据需要处理无效的 JSON。
-
-
提取 JSON 元素 - AWS WAF 根据设置识别要检查的 JSON 元素子集:
-
JSON 匹配范围选项在 JSON 中指定了 AWS WAF 应该检查的元素类型。
您可以为键和值指定键、值或全部。
全部不需要在键中找到匹配项,也无需在值中找到匹配项。它需要在键或值中找到匹配项,或者两者兼有。如需要求在键和值中进行匹配,请使用逻辑
AND
语句组合两个匹配规则,一个检查键,另一个检查值。 -
要检查的内容选项指定如何将元素集筛选为想要 AWS WAF 检查的子集。
您必须指定以下各项之一:
-
完整 JSON 内容 – 评估所有元素。
-
仅包含的元素 – 仅评估其路径与您提供的 JSON 指针条件相匹配的元素。不要使用此选项来指示 JSON 中的 所有路径。请改用完整 JSON 内容。
有关 JSON 指针语法的信息,请参阅互联网工程任务组(IETF)文档 JavaScript 对象表示法(JSON)指针
。 例如,您可以在控制台中提供以下信息:
/dogs/0/name /dogs/1/name
在 API 或 CLI 中,您可以提供以下内容:
"IncludedPaths": ["/dogs/0/name", "/dogs/1/name"]
-
例如,假设要检查的内容设置为仅限包含的元素,“包含的元素”设置为
/a/b
。对于以下示例 JSON 正文:
{ "a":{ "c":"d", "b":{ "e":{ "f":"g" } } } }
下面列出了 AWS WAF 将检查各个 JSON 匹配范围设置的元素集。请注意,键
b
作为所包含的元素路径的一部分,不会进行评估。-
全部:
e
、f,
和g
。 -
键:
e
和f
。 -
值:
g
。
-
-
检查 JSON 元素集 - AWS WAF 将指定的任何文本转换应用到提取的 JSON 元素,然后将生成的元素集与规则语句的匹配条件进行匹配。这与其他 Web 请求组件的转换和评估行为相同。如果有任何提取的元素匹配,则 Web 请求与该规则匹配。