

**引入全新的主机体验 AWS WAF**

现在，您可以使用更新的体验访问控制台中任意位置的 AWS WAF 功能。有关更多详细信息，请参阅[使用控制台](https://docs.aws.amazon.com/waf/latest/developerguide/working-with-console.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在中请求组件 AWS WAF
<a name="waf-rule-statement-fields-list"></a>

本部分将介绍您可以指定检查 web 请求的哪些组件。您可以为在 web 请求中查找模式的匹配规则语句指定请求组件。其中包括字符串匹配、正则表达式模式匹配、SQL 注入攻击和大小约束语句。有关如何使用这些请求组件设置的信息，请访问 [在中使用匹配规则语句 AWS WAF](waf-rule-statements-match.md)，参阅各个规则语句。

除非另有说明，否则，如果 Web 请求没有规则语句中指定的请求组件，则 AWS WAF 会将该请求评估为与规则条件不匹配。

**注意**  
您可以为每个需要它的规则语句指定一个请求组件。要检查请求的多个组件，请为每个组件创建一条规则语句。

 AWS WAF 控制台和 API 文档为以下位置的请求组件设置提供了指导：
+ 控制台上的**规则生成器**：在常规规则类型的**语句**设置中，在**请求组件**下的**检查**对话框中选择要检查的组件。
+ **API 语句内容**：`FieldToMatch`

本节的其余部分将介绍 web 请求检查部分的选项。

**Topics**
+ [HTTP method](#waf-rule-statement-request-component-http-method)
+ [单个标头](#waf-rule-statement-request-component-single-header)
+ [所有标头](#waf-rule-statement-request-component-headers)
+ [标头顺序](#waf-rule-statement-request-component-header-order)
+ [Cookie](#waf-rule-statement-request-component-cookies)
+ [URI 片段](#waf-rule-statement-request-component-uri-fragment)
+ [URI 路径](#waf-rule-statement-request-component-uri-path)
+ [JA3 指纹](#waf-rule-statement-request-component-ja3-fingerprint)
+ [JA4 指纹](#waf-rule-statement-request-component-ja4-fingerprint)
+ [查询字符串](#waf-rule-statement-request-component-query-string)
+ [Single query parameter (单个查询参数)](#waf-rule-statement-request-component-single-query-param)
+ [All query parameters (所有查询参数)](#waf-rule-statement-request-component-all-query-params)
+ [Body](#waf-rule-statement-request-component-body)
+ [JSON 正文](#waf-rule-statement-request-component-json-body)

## HTTP method
<a name="waf-rule-statement-request-component-http-method"></a>

检查请求中的 HTTP 方法。HTTP 方法指示 web 请求要求受保护的资源执行的操作的类型，如 `POST` 或 `GET`。

## 单个标头
<a name="waf-rule-statement-request-component-single-header"></a>

检查请求中的单个命名标头。

对于此选项，您可以指定标头名称，例如 `User-Agent` 或 `Referer`。名称的字符串匹配不区分大小写，是在删除请求标头和规则中的前导和尾随空格之后执行的。

## 所有标头
<a name="waf-rule-statement-request-component-headers"></a>

检查所有请求标头，包括 Cookie。您可以应用筛选器来检查所有标头的子集。

对于此选项，您需要提供以下规范：
+ **匹配模式**-用于获取标题子集以供检查的过滤器。 AWS WAF 在标题键中查找这些模式。

  匹配模式设置可采用以下的一种设置：
  + **全部**：匹配所有键。评估所有标头的规则检查条件。
  + **排除标头**：仅检查其键与此处指定的任何字符串都不匹配的标头。键的字符串匹配不区分大小写。匹配是在从请求标头和匹配规则中删除前导和尾随空格后执行的。
  + **包含标头**：仅检查键与此处指定的字符串之一匹配的标头。键的字符串匹配不区分大小写。匹配是在从请求标头和匹配规则中删除前导和尾随空格后执行的。
+ **匹配范围**-标题中 AWS WAF 应根据规则检查标准进行检查的部分。您可以指定**键**、**值**或**全部**来检查键和值是否匹配。

  **全部**不需要在键中找到匹配项，也无需在值中找到匹配项。它需要在键或值中找到匹配项，或者两者兼有。如需要求在键和值中进行匹配，请使用逻辑 `AND` 语句组合两个匹配规则，一个检查键，另一个检查值。
+ **超大处理** — AWS WAF 应如何处理标头数据大于 AWS WAF 可以检查的请求。 AWS WAF 最多可以检查请求标头的前 8 KB（8,192 字节），最多可以检查前 200 个标头。在达到第一个限制之前 AWS WAF ，内容可供检查。您可以选择继续检查，也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息，请参阅 [中的 Web 请求组件过大 AWS WAF](waf-oversize-request-components.md)。

## 标头顺序
<a name="waf-rule-statement-request-component-header-order"></a>

检查包含请求标头名称列表的字符串，这些标头名称按 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 ，内容可供检查。您可以选择继续检查可用标头，也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息，请参阅 [中的 Web 请求组件过大 AWS WAF](waf-oversize-request-components.md)。

## Cookie
<a name="waf-rule-statement-request-component-cookies"></a>

检查所有请求 Cookie。您可以应用筛选器来检查所有 Cookie 的子集。

对于此选项，您需要提供以下规范：
+ **匹配模式** – 用于获取 Cookie 子集以供检查的筛选器。 AWS WAF 在 Cookie 密钥中查找这些模式。

  匹配模式设置可采用以下的一种设置：
  + **全部**：匹配所有键。评估所有 Cookie 的规则检查条件。
  + **排除 Cookie** – 仅检查其键与此处指定的任何字符串都不匹配的 Cookie。键的字符串匹配不区分大小写且必须精确。
  + **包含 Cookie** – 仅检查键与此处指定的字符串之一匹配的 Cookie。键的字符串匹配不区分大小写且必须精确。
+ **匹配范围** — Cookie 中 AWS WAF 应根据规则检查标准进行检查的部分。您可以为键和值指定**键**、**值**或**全部**。

  **全部**不需要在键中找到匹配项，也无需在值中找到匹配项。它需要在键或值中找到匹配项，或者两者兼有。如需要求在键和值中进行匹配，请使用逻辑 `AND` 语句组合两个匹配规则，一个检查键，另一个检查值。
+ **超大处理** — AWS WAF 应如何处理 cookie 数据大于 AWS WAF 可以检查的请求。 AWS WAF 最多可以检查请求的 cookie 的前 8 KB（8,192 字节），最多可以检查前 200 个 cookie。在达到第一个限制之前 AWS WAF ，内容可供检查。您可以选择继续检查，也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息，请参阅 [中的 Web 请求组件过大 AWS WAF](waf-oversize-request-components.md)。

## URI 片段
<a name="waf-rule-statement-request-component-uri-fragment"></a>

**注意**  
Uri Fragment 检查仅适用于 CloudFront 发行版和应用程序负载均衡器。

检查 URL 中紧接“\$1”符号的部分，提供有关资源的其他信息，例如 \$1section2。有关信息，请参阅[统一资源标识符（URI）：一般语法](https://tools.ietf.org/html/rfc3986#section-3)。

如果您不使用带此选项的文本转换，则 AWS WAF 不会对 URI 片段进行标准化处理，并完全按照请求中从客户端收到的内容进行检查。有关文本转换的信息，请参阅 [在中使用文本转换 AWS WAF](waf-rule-statement-transformation.md)。

**规则语句要求**  
您必须为此规则语句提供回退行为。如果 URI 缺少片段或关联的服务不是 Application Load Balancer 或，则回退行为是您要 AWS WAF 分配给 Web 请求的匹配状态。 CloudFront如果您选择匹配，则 AWS WAF 会将请求视为匹配规则语句并将规则操作应用于该请求。如果您选择不匹配，则 AWS WAF 会将请求视为与规则语句不匹配。

## URI 路径
<a name="waf-rule-statement-request-component-uri-path"></a>

检查 URL 中标识资源的部分（例如 `/images/daily-ad.jpg`）。有关信息，请参阅[统一资源标识符 (URI)：一般语法](https://tools.ietf.org/html/rfc3986#section-3)。

如果您不使用带此选项的文本转换，则 AWS WAF 不会对 URI 进行标准化处理，并完全按照请求中从客户端收到的内容进行检查。有关文本转换的信息，请参阅 [在中使用文本转换 AWS WAF](waf-rule-statement-transformation.md)。

## JA3 指纹
<a name="waf-rule-statement-request-component-ja3-fingerprint"></a>

检查请求的 JA3 指纹。

**注意**  
JA3 指纹检查仅适用于 Amazon CloudFront 分配和应用程序负载均衡器。

指 JA3 纹是一个 32 个字符的哈希值，源自传入请求的 TLS 客户端 Hello。此指纹用作客户端 TLS 配置的唯一标识符。 AWS WAF 计算并记录每个具有足够的 TLS Client Hello 信息用于计算的请求的此指纹。几乎所有的 web 请求都包含此信息。

**如何获取客户的指 JA3 纹**  
您可以从保护包 (Web ACL) 日志中获取客户端请求的 JA3 指纹。 AWS WAF 如果能够计算出指纹，它就会将其包含在日志中。有关日志记录字段的信息，请参阅 [保护包（web ACL）流量的日志字段](logging-fields.md)。

**规则语句要求**  
您只能在设置为与您提供的字符串完全匹配的字符串匹配语句中检查 JA3 指纹。在您的字符串匹配语句规范中提供来自日志的 JA3 指纹字符串，以便与任何具有相同 TLS 配置的 future 请求相匹配。有关字符串匹配语句的信息，请参阅 [字符串匹配规则语句](waf-rule-statement-type-string-match.md)。

您必须为此规则语句提供回退行为。回退行为是指在无法计算 JA3 指纹 AWS WAF 时要分配给 Web 请求的匹配状态。 AWS WAF 如果您选择匹配， AWS WAF 会将 Web 请求视为与规则语句匹配，并将规则操作应用于请求。如果您选择不匹配，则 AWS WAF 会将请求视为与规则语句不匹配。

如需使用此匹配选项，必须记录您的保护包（web ACL）流量。有关信息，请参阅[记录 AWS WAF 保护包 (Web ACL) 流量](logging.md)。

## JA4 指纹
<a name="waf-rule-statement-request-component-ja4-fingerprint"></a>

检查请求的 JA4 指纹。

**注意**  
JA4 指纹检查仅适用于 Amazon CloudFront 分配和应用程序负载均衡器。

指 JA4 纹是一个 36 个字符的哈希值，源自传入请求的 TLS 客户端 Hello。此指纹用作客户端 TLS 配置的唯一标识符。 JA4 指纹识别是 JA3 指纹识别的扩展，它可能会减少某些浏览器的唯一指纹。 AWS WAF 计算并记录每个具有足够的 TLS Client Hello 信息用于计算的请求的此指纹。几乎所有的 web 请求都包含此信息。

**如何获取客户的指 JA4 纹**  
您可以从保护包 (Web ACL) 日志中获取客户端请求的 JA4 指纹。 AWS WAF 如果能够计算出指纹，它就会将其包含在日志中。有关日志记录字段的信息，请参阅 [保护包（web ACL）流量的日志字段](logging-fields.md)。

**规则语句要求**  
您只能在设置为与您提供的字符串完全匹配的字符串匹配语句中检查 JA4 指纹。在您的字符串匹配语句规范中提供来自日志的 JA4 指纹字符串，以便与任何具有相同 TLS 配置的 future 请求相匹配。有关字符串匹配语句的信息，请参阅 [字符串匹配规则语句](waf-rule-statement-type-string-match.md)。

您必须为此规则语句提供回退行为。回退行为是指在无法计算 JA4 指纹 AWS WAF 时要分配给 Web 请求的匹配状态。 AWS WAF 如果您选择匹配， AWS WAF 会将 Web 请求视为与规则语句匹配，并将规则操作应用于请求。如果您选择不匹配，则 AWS WAF 会将请求视为与规则语句不匹配。

如需使用此匹配选项，必须记录您的保护包（web ACL）流量。有关信息，请参阅[记录 AWS WAF 保护包 (Web ACL) 流量](logging.md)。

## 查询字符串
<a name="waf-rule-statement-request-component-query-string"></a>

检查 URL 中在 `?` 字符之后出现的部分（如果有）。

**注意**  
对于跨站点脚本匹配语句，我们建议您选择**所有查询参数**，而不是**查询字符串**。选择 “**所有查询参数**” WCUs 将基础成本增加 10。

## Single query parameter (单个查询参数)
<a name="waf-rule-statement-request-component-single-query-param"></a>

检查您定义为查询字符串一部分的单个查询参数。 AWS WAF 检查您指定的参数的值。

对于此选项，您还可以指定一个**查询参数**。例如，如果 URL 为 `www.xyz.com?UserName=abc&SalesRegion=seattle`，则可以为该查询参数指定 `UserName` 或 `SalesRegion`。参数名称的长度上限是 30 个字符。名称不区分大小写，因此如果您指定 `UserName` 作为名称， AWS WAF 匹配 `UserName` 的所有变体，包括 `username` 和 `UsERName`。

如果查询字符串包含您指定的查询参数的多个实例，则使用OR逻辑 AWS WAF 检查所有值是否存在匹配项。例如，在 URL `www.xyz.com?SalesRegion=boston&SalesRegion=seattle` 中， AWS WAF 根据 `boston` 和 `seattle` 评估您指定的名称。如果匹配其中任意一个，则检查匹配。

## All query parameters (所有查询参数)
<a name="waf-rule-statement-request-component-all-query-params"></a>

检查请求中的所有查询参数。这与单个查询参数组件选择类似，但 AWS WAF 会检查查询字符串中所有参数的值。例如，如果 URL 为 `www.xyz.com?UserName=abc&SalesRegion=seattle`，并且如果 `UserName` 或 `SalesRegion` 的值与检查条件匹配， AWS WAF 则会触发匹配。

选择此选项会 WCUs 使基本成本增加 10%。

## Body
<a name="waf-rule-statement-request-component-body"></a>

以纯文本形式检查请求正文。您也可以使用 JSON 内容类型将正文评估为 JSON。

请求正文紧跟在请求标头之后的请求部分。它包含 web 请求所需的任何其他数据，例如，表单中的数据。
+ 在控制台中，您可以在**请求选项**选择**正文**下选择此选项，方法是选择**内容类型**选择**纯文本**。
+ 在 API 中，您可以在规则的 `FieldToMatch` 规范中指定 `Body` 以纯文本形式检查请求正文。

对于 Applicati AWS AppSync on Load Balancer 和， AWS WAF 可以检查请求正文的前 8 KB。对于 CloudFront，默认情况下，API Gateway、Amazon Cognito、App Runner 和 Verified Access AWS WAF 可以检查前 16 KB，你可以在保护包（Web ACL）配置中将限制提高到 64 KB。有关更多信息，请参阅 [管理人体检查的注意事项 AWS WAF](web-acl-setting-body-inspection-limit.md)。

您必须为此组件类型指定超大尺寸处理。超大处理定义了如何 AWS WAF 处理主体数据大于 AWS WAF 可以检查的请求。您可以选择继续检查，也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息，请参阅 [中的 Web 请求组件过大 AWS WAF](waf-oversize-request-components.md)。

您也可以将正文评估为已解析的 JSON。有关信息，请参阅下面的部分。

## JSON 正文
<a name="waf-rule-statement-request-component-json-body"></a>

检查以 JSON 形式评估的请求正文。您还可以以纯文本形式评估正文。

请求正文紧跟在请求标头之后的请求部分。它包含 web 请求所需的任何其他数据，例如，表单中的数据。
+ 在控制台中，您可以在**请求选项**选择**正文**下选择此选项，方法是选择**内容类型**选择**JSON**。
+ 在 API 中，您可以在规则的 `FieldToMatch` 规范中指定 `JsonBody`。

对于 Applicati AWS AppSync on Load Balancer 和， AWS WAF 可以检查请求正文的前 8 KB。对于 CloudFront，默认情况下，API Gateway、Amazon Cognito、App Runner 和 Verified Access AWS WAF 可以检查前 16 KB，你可以在保护包（Web ACL）配置中将限制提高到 64 KB。有关更多信息，请参阅 [管理人体检查的注意事项 AWS WAF](web-acl-setting-body-inspection-limit.md)。

您必须为此组件类型指定超大尺寸处理。超大处理定义了如何 AWS WAF 处理主体数据大于 AWS WAF 可以检查的请求。您可以选择继续检查，也可以跳过检查并将请求标记为匹配或不匹配规则。有关处理超大处理内容的更多信息，请参阅 [中的 Web 请求组件过大 AWS WAF](waf-oversize-request-components.md)。

选择此选项会使匹配语句的基本成本加倍 WCUs。例如，如果在没有 JSON 解析 WCUs 的情况下，匹配语句的基本成本为 5，则使用 JSON 解析将成本加倍到 10。 WCUs

对于此选项，应提供其他规范，如以下部分所述。

**如何 AWS WAF 处理 JSON 正文检查**  
当以 JSON 形式 AWS WAF 检查 Web 请求正文时，它会执行解析正文并提取 JSON 元素以供检查的步骤。 AWS WAF 根据您的配置选择执行这些步骤。

以下列出了 AWS WAF 执行的步骤。

1. **解析正文内容** — AWS WAF 解析 Web 请求正文的内容以提取 JSON 元素进行检查。 AWS WAF 尽最大努力解析正文的全部内容，但是由于内容中的各种错误状态，解析可能会失败。错误示例包括无效字符、重复键、截断以及其根节点不是对象或数组的内容。

   选项 B **ody 解析后备行为**决定了如果 AWS WAF 无法完全解析 JSON 正文会怎么做：
   + **无（默认行为）**-仅在内容遇到解析错误之前对其进行 AWS WAF 评估。
   + **评估为字符串**-以纯文本形式检查正文。 AWS WAF 将您为 JSON 检查定义的文本转换和检查标准应用于正文文本字符串。
   + **匹配**-将 Web 请求视为与规则语句相匹配。 AWS WAF 将规则操作应用于请求。
   + **不匹配**：将 web 请求视为与规则语句不匹配。
**注意**  
只有在解析 JSON 字符串时 AWS WAF 遇到错误时，才会触发此回退行为。

**解析不能完全验证 JSON**  
AWS WAF 解析并不能完全验证输入的 JSON 字符串，因此即使对于无效的 JSON，解析也可能成功。

   例如， AWS WAF 解析以下无效 JSON 而不会出现错误：
   + 缺少逗号：`{"key1":"value1""key2":"value2"}`
   + 缺少冒号：`{"key1":"value1","key2""value2"}`
   + 额外的冒号：`{"key1"::"value1","key2""value2"}`

   对于诸如解析成功但结果不是完全有效的 JSON 之类的情况，评估中的后续步骤结果可能会有所不同。提取可能会遗漏某些元素，或者规则评估可能会产生意外结果。我们建议验证在应用程序中收到的 JSON，并根据需要处理无效的 JSON。

1. **提取 JSON 元素** — 根据您的设置 AWS WAF 识别要检查的 JSON 元素子集：
   + **JSON 匹配范围**选项指定了 JSON 中 AWS WAF 应检查的元素类型。

     您可以为键和值指定**键**、**值**或**全部**。

     **全部**不需要在键中找到匹配项，也无需在值中找到匹配项。它需要在键或值中找到匹配项，或者两者兼有。如需要求在键和值中进行匹配，请使用逻辑 `AND` 语句组合两个匹配规则，一个检查键，另一个检查值。
   + “**要检查的内容**” 选项指定如何筛选设置为 AWS WAF 要检查的子集的元素。

     您必须指定以下各项之一：
     + **完整 JSON 内容**：评估所有元素。
     + **仅包含的元素**：仅评估其路径与您提供的 JSON 指针条件相匹配的元素。不要使用此选项来指示 JSON 中的 *所有*路径。请改用**完整 JSON 内容**。

       有关 JSON 指针语法的信息，请参阅互联网工程任务组 (IETF) 文档[JavaScript 对象表示法 (JSON) 指针](https://tools.ietf.org/html/rfc6901)。

       例如，您可以在控制台中提供以下信息：

       ```
       /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`。

1. **检查 JSON 元素集** — AWS WAF 将您指定的任何文本转换应用于提取的 JSON 元素，然后将生成的元素集与规则语句的匹配条件进行匹配。这与其他 web 请求组件的转换和评估行为相同。如果有任何提取的元素匹配，则 web 请求与该规则匹配。