

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

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

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

# 在中使用规则语句 AWS WAF
<a name="waf-rule-statements"></a>

本节介绍了规则语句的工作方式。

规则语句是告诉 AWS WAF 如何检查 Web 请求的规则的一部分。当在 Web 请求中 AWS WAF 找到检查标准时，我们会说 Web 请求与声明相符。每个规则语句都根据语句类型指定要查找的内容和方式。

中的每条规则都 AWS WAF 有一个顶级规则语句，该语句可以包含其他语句。规则语句可能非常简单。例如，您可以在保护包（web ACL）中设置一个规则语句，提供一组来源国来检查 web 请求，也可以在保护包（web ACL）中设置一个规则语句，只引用一个规则组。规则语句也可能非常复杂。例如，您可以编写一个使用逻辑 AND、OR 和 NOT 语句组合多个其他语句的语句。

对于大多数规则，您可以为匹配的请求添加自定义 AWS WAF 标签。 AWS 托管规则组中的规则为匹配的请求添加标签。规则添加的标签提供有关规则请求的信息，这些规则将在稍后在保护包 (Web ACL) 以及 AWS WAF 日志和指标中进行评估。有关标签的信息，请参阅 [在 Web 请求中添加标签 AWS WAF](waf-labels.md) 和 [标签匹配规则语句](waf-rule-statement-type-label-match.md)。

**嵌套规则语句**  
AWS WAF 支持嵌套许多规则语句，但不支持所有规则语句嵌套。例如，您不能将规则组语句嵌套到其他语句中。某些场景需要使用嵌套，例如范围缩小语句和逻辑语句。下面的规则语句列表和规则详细信息描述了每个类别和规则的嵌套功能和要求。

控制台中规则的可视化编辑器仅支持规则语句的嵌套级别。例如，可以在具有逻辑性的 AND 或 OR 规则中嵌套多种类型的语句，但不能嵌套其他 AND 或 OR 规则，因为这需要第二层嵌套。要实现多级嵌套，请通过控制台中的 JSON 规则编辑器或通过 JSON 提供规则定义。APIs

**Topics**
+ [在中调整规则语句设置 AWS WAF](waf-rule-statement-fields.md)
+ [在中使用范围缩小语句 AWS WAF](waf-rule-scope-down-statements.md)
+ [在中引用可重复使用的实体 AWS WAF](waf-rule-statement-reusable-entities.md)

# 在中调整规则语句设置 AWS WAF
<a name="waf-rule-statement-fields"></a>

本节介绍您可为检查 Web 请求组件的规则语句指定哪些设置。有关用法的信息，请参阅 [在中使用匹配规则语句 AWS WAF](waf-rule-statements-match.md) 中的各个规则语句。

这些 Web 请求组件的子集也可以在基于速率的规则中用作自定义请求聚合键。有关信息，请参阅[在中汇总基于费率的规则 AWS WAF](waf-rule-statement-type-rate-based-aggregation-options.md)。

对于请求组件设置，您可以指定组件类型本身以及其他选项，具体取决于组件类型。例如，当检查含有文本的组件类型时，可以在检查之前对其应用文本转换。

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

**Contents**
+ [在中请求组件 AWS WAF](waf-rule-statement-fields-list.md)
  + [HTTP method](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-http-method)
  + [单个标头](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-single-header)
  + [所有标头](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-headers)
  + [标头顺序](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-header-order)
  + [Cookie](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-cookies)
  + [URI 片段](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-uri-fragment)
  + [URI 路径](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-uri-path)
  + [JA3 指纹](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-ja3-fingerprint)
  + [JA4 指纹](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-ja4-fingerprint)
  + [查询字符串](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-query-string)
  + [Single query parameter (单个查询参数)](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-single-query-param)
  + [All query parameters (所有查询参数)](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-all-query-params)
  + [Body](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-body)
  + [JSON 正文](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-json-body)
+ [在中使用转发的 IP 地址 AWS WAF](waf-rule-statement-forwarded-ip-address.md)
+ [正在检查 HTTP/2 中的伪标头 AWS WAF](waf-rule-statement-request-components-for-http2-pseudo-headers.md)
+ [在中使用文本转换 AWS WAF](waf-rule-statement-transformation.md)

# 在中请求组件 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 请求与该规则匹配。

# 在中使用转发的 IP 地址 AWS WAF
<a name="waf-rule-statement-forwarded-ip-address"></a>

本节适用于使用 web 请求的 IP 地址的规则语句。默认情况下， AWS WAF 使用来自 Web 请求来源的 IP 地址。但是，如果 web 请求通过一个或多个代理或负载均衡器，则 web 请求源将包含最后一个代理的地址，而不是客户端的源地址。在这种情况下，原始客户端地址通常在另一个 HTTP 标头中转发。此标头通常是 `X-Forwarded-For` (XFF)，但也可以是其他标头。

**使用 IP 地址的规则语句**  
使用 IP 地址的规则语句如下：
+ [IP 集匹配](waf-rule-statement-type-ipset-match.md)：检查 IP 地址是否与 IP 集中定义的地址相匹配。
+ [地理匹配](waf-rule-statement-type-geo-match.md) – 使用 IP 地址确定来源国和地区，并将来源国与国家列表进行匹配。
+ [ASN 匹配](waf-rule-statement-type-asn-match.md)-使用 IP 地址确定自治系统编号 (ASN)，并将 ASN 与列表进行匹配。 ASNs
+ [使用基于速率的规则语句](waf-rule-statement-type-rate-based.md)：可以按其 IP 地址聚合请求，以确保没有单个 IP 地址以过高速率发送请求。您可以单独使用 IP 地址聚合，也可以与其他聚合键结合使用。

您可以指示使用来自`X-Forwarded-For`标头或 AWS WAF 其他 HTTP 标头的转发 IP 地址来处理这些规则语句中的任何一个，而不是使用 Web 请求的来源。有关如何提供规范的详细信息，请参阅各个规则语句类型的指南。

**注意**  
如果缺少标头，则将使用该标头的任何语句 AWS WAF 评估为 “不匹配”。如果您使用结果为 “不匹配” 的 NOT 语句，则会将计算结果 AWS WAF 转换为 “匹配”。缺少标头不会触发回退行为，只有无效的标头值才会触发回退行为。

**回退行为**  
使用转发的 IP 地址时，如果请求的指定位置没有有效的 IP 地址，则需要指明 AWS WAF 要分配给 Web 请求的匹配状态：
+ **MATCH**-将 Web 请求视为与规则语句相匹配。 AWS WAF 将规则操作应用于请求。
+ **不匹配**：将 web 请求视为与规则语句不匹配。

**AWS WAF 机器人控制中使用的 IP 地址**  
Bot Control 托管规则组使用来自 AWS WAF的 IP 地址验证机器人。如果您使用机器人控制功能，并且已经验证了通过代理或负载均衡器进行路由的机器人，则需要使用自定义规则明确允许它们。例如，您可以配置自定义 IP 集匹配规则，该规则使用转发 IP 地址来检测和允许已验证机器人。您可以使用该规则通过多种方式自定义机器人管理。有关信息以及示例，请参阅 [AWS WAF 机器人控制](waf-bot-control.md)。

**使用转发 IP 地址的一般注意事项**  
在使用转发 IP 地址之前，请注意以下一般注意事项：
+ 在此过程中，代理可以修改标头，并代理可能会以不同的方式处理标头。
+ 攻击者可能会更改标头的内容以试图绕过 AWS WAF 检查。
+ 标头内的 IP 地址可能格式错误或无效。
+ 请求中可能根本不存在您指定的标头。

**使用转发的 IP 地址的注意事项 AWS WAF**  
以下列表描述了在中使用转发的 IP 地址的要求和注意事项： AWS WAF
+ 对于任何一条规则，您可以为转发 IP 地址指定一个标头。标头规范不区分大小写。
+ 对于基于速率的规则语句，任何嵌套的范围界定语句都不会继承转发的 IP 配置。为每条使用转发 IP 地址的语句指定配置。
+ 对于地理匹配、ASN 匹配和基于费率的规则， AWS WAF 使用标题中的第一个地址。例如，如果标题包含 us `10.1.1.1, 127.0.0.0, 10.10.10.10` AWS WAF es `10.1.1.1`
+ 对于 IP 集匹配，您可以指明是与标头中的第一个地址、最后一个地址还是任何地址进行匹配。如果指定，则 AWS WAF 检查标头中的所有地址是否匹配，最多 10 个地址。如果标头包含超过 10 个地址，则 AWS WAF 检查最后 10 个地址。
+ 包含多个地址的标头必须在地址之间使用逗号分隔符。如果请求使用逗号以外的分隔符，则 AWS WAF 会认为标头中的 IP 地址格式不正确。
+ 如果标头内的 IP 地址格式错误或无效，则 AWS WAF 根据您在转发的 IP 配置中指定的回退行为，将 web 请求指定为与规则匹配或不匹配。
+ 如果您指定的标头不存在于请求中，则 AWS WAF 根本不会将该规则应用于请求。这意味着 AWS WAF 它不应用规则操作，也不应用回退行为。
+ 使用转发 IP 标头作为 IP 地址的规则语句不会使用 web 请求来源报告的 IP 地址。

**使用转发的 IP 地址的最佳实践 AWS WAF**  
使用转发 IP 地址时，请使用以下最佳实践：
+ 在启用转发 IP 配置之前，请仔细考虑请求标头的所有可能状态。您可能需要使用多个规则来获得您想要的行为。
+ 要检查多个转发 IP 标头或检查 web 请求来源和转发 IP 标头，请对每个 IP 地址源使用一条规则。
+ 要阻止标头无效的 web 请求，请将规则操作设置为阻止，并将转发 IP 配置的回退行为设置为匹配。

**转发 IP 地址的 JSON 示例**  
只有当 `X-Forwarded-For` 标头包含来源国为 `US` 的 IP 时，以下地理匹配语句才会匹配：

```
{
  "Name": "XFFTestGeo",
  "Priority": 0,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "XFFTestGeo"
  },
  "Statement": {
    "GeoMatchStatement": {
      "CountryCodes": [
        "US"
      ],
      "ForwardedIPConfig": {
        "HeaderName": "x-forwarded-for",
        "FallbackBehavior": "MATCH"
      }
    }
  }
}
```

以下基于速率的规则根据 `X-Forwarded-For` 标头中的第一个 IP 来聚合请求。该规则仅计算与嵌套地理匹配语句匹配的请求，并且仅阻止与地理匹配语句匹配的请求。嵌套的地理匹配语句还使用 `X-Forwarded-For` 标头来确定 IP 地址是否表示 `US` 来源国。如果是，或者标头存在但格式不正确，则地理匹配语句将返回匹配项。

```
{
  "Name": "XFFTestRateGeo",
  "Priority": 0,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "XFFTestRateGeo"
  },
  "Statement": {
    "RateBasedStatement": {
      "Limit": "100",
      "AggregateKeyType": "FORWARDED_IP",
      "ScopeDownStatement": {
        "GeoMatchStatement": {
          "CountryCodes": [
            "US"
          ],
          "ForwardedIPConfig": {
            "HeaderName": "x-forwarded-for",
            "FallbackBehavior": "MATCH"
          }
        }
      },
      "ForwardedIPConfig": {
        "HeaderName": "x-forwarded-for",
        "FallbackBehavior": "MATCH"
      }
    }
  }
}
```

# 正在检查 HTTP/2 中的伪标头 AWS WAF
<a name="waf-rule-statement-request-components-for-http2-pseudo-headers"></a>

本节介绍如何使用 AWS WAF 来检查 HTTP/2 伪标头。

支持 HTTP/2 流量的受保护 AWS 资源不会将 HTTP/2 伪标头转发到以 AWS WAF 供检查，但它们在用于检查的 Web 请求组件中提供伪标头的内容。 AWS WAF 

您可以使用 AWS WAF 仅检查下表中列出的伪标头。


**映射到 Web 请求组件的 HTTP/2 伪标头内容**  

| HTTP/2 伪标头 | 要检查的 Web 请求组件 | 文档 | 
| --- | --- | --- | 
|  `:method`  |  HTTP method   |  [HTTP method](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-http-method)  | 
|  `:authority`  |  `Host` 标头   |  [单个标头](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-single-header)  [所有标头](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-headers)  | 
|  `:path` URI 路径  | URI 路径  | [URI 路径](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-uri-path) | 
|  `:path` query  |  查询字符串  |  [查询字符串](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-query-string) [Single query parameter (单个查询参数)](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-single-query-param) [All query parameters (所有查询参数)](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-all-query-params)  | 

# 在中使用文本转换 AWS WAF
<a name="waf-rule-statement-transformation"></a>

本节介绍如何在检查请求之前提供 AWS WAF 要应用的转换。

在查找模式或设置约束条件的语句中，您可以在检查请求之前提供 AWS WAF 要应用的转换。转换会重新设置 Web 请求的格式，消除了一些不寻常的格式，可防范攻击者使用它们以试图绕过 AWS WAF。

当您将其与 JSON 正文请求组件选择一起使用时， AWS WAF 会在解析并从 JSON 中提取要检查的元素之后应用您的转换。有关更多信息，请参阅 [JSON 正文](waf-rule-statement-fields-list.md#waf-rule-statement-request-component-json-body)。

如果提供多个转换，还应当设置 AWS WAF 应用这些转换的顺序。

**WCUs**— 每个文本转换为 10 WCUs。

 AWS WAF 控制台和 API 文档还在以下位置为这些设置提供了指导：
+ 控制台上的**规则生成器** – **文本转换**。当您使用请求组件时，可使用此选项。
+ **API 语句内容** – `TextTransformations`文本转换的选项

每个转换列表都显示了控制台和 API 规范，后面是相应描述。

Base64 decode – `BASE64_DECODE`  
AWS WAF 解码一个 Base64 编码的字符串。

Base64 decode extension – `BASE64_DECODE_EXT`  
AWS WAF 解码 Base64 编码的字符串，但使用忽略无效字符的宽容实现。

Command line – `CMD_LINE`  
此选项可减少攻击者可能注入操作系统命令行命令并使用不寻常的格式伪装部分或全部命令的情况。  
使用此选项可执行以下转换：  
+ 删除以下字符：`\ " ' ^`
+ 删除以下字符之前的空格：`/ (`
+ 将以下字符替换为空格：`, ;`
+ 将多个空格替换为一个空格
+ 将大写字母 `A-Z` 转换为小写字母 `a-z`

Compress whitespace – `COMPRESS_WHITE_SPACE`  
AWS WAF 通过将多个空格替换为一个空格并将以下字符替换为空格字符 (ASCII 32) 来压缩空白：  
+ Formfeed (ASCII 12)
+ Tab (ASCII 9)
+ 换行符 (ASCII 10)
+ 回车 (ASCII 13)
+ 垂直制表符 (ASCII 11)
+ 不间断空格 (ASCII 160)

CSS decode – `CSS_DECODE`  
AWS WAF 解码使用 CSS 2.x 转义规则编码的字符。`syndata.html#characters`此函数在解码过程中最多使用两个字节，因此它可以帮助发现使用 CSS 编码而通常不会被编码的 ASCII 字符。它也可用于反规避，规避是反斜杠和非十六进制字符的组合。例如，`javascript` 的 `ja\vascript`。

Escape sequences decode – `ESCAPE_SEQ_DECODE`  
AWS WAF 解码以下 ANSI C 转义序列：`\a`、、`\b`、`\f`、、`\n`、`\r`、`\t`、`\v`、`\\``\?`、（十六进制）`\'``\"`、`\xHH`（八进制）。`\0OOO`无效的编码保留在输出中。

Hex decode – `HEX_DECODE`  
AWS WAF 将一串十六进制字符解码为二进制。

HTML entity decode – `HTML_ENTITY_DECODE`  
AWS WAF 用相应的字符替换以十六进制格式`&#xhhhh;`或十进制格式表示`&#nnnn;`的字符。  
AWS WAF 将以下 HTML 编码的字符替换为未编码的字符。此列表使用小写的 HTML 编码，但处理方式不区分大小写，比如 `&QuOt;` 和 `&quot;` 以相同方式处理。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/waf/latest/developerguide/waf-rule-statement-transformation.html)

JS decode – `JS_DECODE`  
AWS WAF 解码 JavaScript 转义序列。如果 `\uHHHH` 编码在 `FF01-FF5E` 的全角 ASCII 码范围内，则较高的字节用于检测和调整较低的字节。如果不是，则仅使用较低的字节，将较高的字节归零，从而可能导致信息丢失。

Lowercase – `LOWERCASE`  
AWS WAF 将大写字母 (A-Z) 转换为小写字母 (a-z)。

MD5 – `MD5`  
AWS WAF 根据输入中的数据计算 MD5 哈希值。计算的哈希是原始二进制形式。

None – `NONE`  
AWS WAF 检查收到的 Web 请求，不进行任何文本转换。

Normalize path – `NORMALIZE_PATH`  
AWS WAF 通过删除不在输入开头的多个斜杠、目录自引用和目录反向引用来规范化输入字符串。

Normalize path Windows – `NORMALIZE_PATH_WIN`  
AWS WAF 将反斜杠字符转换为正斜杠，然后使用转换处理生成的字符串。`NORMALIZE_PATH`

Remove nulls – `REMOVE_NULLS`  
AWS WAF 从输入中移除所有`NULL`字节。

Replace comments – `REPLACE_COMMENTS`  
AWS WAF 将每次出现的 C 风格注释 (/\$1... \$1/) 替换为单个空格。它不会压缩连续出现的多个事件。它会将未终止的注释替换为空格 (ASCII 0x20)。它不会更改独立终止的注释 (\$1/)。

Replace nulls – `REPLACE_NULLS`  
AWS WAF 用空格`NULL`字符 (ASCII 0x20) 替换输入中的每个字节。

SQL hex decode – `SQL_HEX_DECODE`  
AWS WAF 解码 SQL 十六进制数据。例如，将 (`0x414243`) AWS WAF 解码为 (`ABC`)。

URL decode – `URL_DECODE`  
AWS WAF 解码 URL 编码的值。

URL decode Unicode – `URL_DECODE_UNI`  
与 `URL_DECODE` 类似，但支持 Microsoft 特定的 `%u` 编码。如果代码在 `FF01-FF5E` 的全角 ASCII 码范围内，则较高的字节用于检测和调整较低的字节。否则，仅使用较低的字节，将较高的字节归零。

UTF8 to Unicode – `UTF8_TO_UNICODE`  
AWS WAF 将所有 UTF-8 字符序列转换为 Unicode。这有助于输入规范化，并最大限度地减少非英语语言的误报。

# 在中使用范围缩小语句 AWS WAF
<a name="waf-rule-scope-down-statements"></a>

本节介绍了什么是缩小范围语句及其工作方式。

范围缩小语句是一种可嵌套的规则语句，您可以将其添加到托管规则组语句或基于速率的语句中，以缩小包含规则评估的请求集的范围。包含规则仅评估与范围缩小语句匹配的请求。
+ **托管规则组语句**-如果您向托管规则组语句添加范围缩小语句，则 AWS WAF 会将任何与范围向下语句不匹配的请求评估为与规则组不匹配。只有符合范围缩小语句的请求才会根据规则组进行评估。对于定价基于被评估请求的数量的托管规则组，范围缩小语句可以帮助其控制成本。

  有关托管规则组语句的更多信息，请参阅 [在中使用托管规则组语句 AWS WAF](waf-rule-statement-type-managed-rule-group.md)。
+ **基于速率的规则语句** – 没有范围缩小语句的基于速率的规则语句会限制该规则评估的所有请求。如果您只想控制特定类别的请求的速率，请在基于速率的规则中添加范围缩小语句。例如，要仅跟踪和控制来自特定地理区域的请求速率，可以在地理匹配语句中指定该地理区域，并将其作为范围缩小语句添加到基于速率的规则中。

  有关基于速率的规则语句的更多信息，请参阅 [在中使用基于费率的规则语句 AWS WAF](waf-rule-statement-type-rate-based.md)。

您可以在范围缩小语句中使用任何可嵌套规则。有关可用语句，请参阅 [在中使用匹配规则语句 AWS WAF](waf-rule-statements-match.md) 和 [在中使用逻辑规则语句 AWS WAF](waf-rule-statements-logical.md)。f WCUs or a scope-down 语句是您在其中定义的规则语句所 WCUs 必需的。使用范围缩小语句不会产生额外成本。

您可以像在常规规则中使用该语句一样配置范围缩小语句。例如，您可以对正在检查的 Web 请求组件应用文本转换，也可以指定要用作 IP 地址的被转发 IP 地址。这些配置仅适用于范围缩小语句，不由包含的托管规则组或基于速率的规则语句继承。

例如，如果您在范围缩小语句中对查询字符串应用文本转换，则在应用转换后，范围缩小语句会检查查询字符串。如果请求与范围缩小语句条件相匹配，则 AWS WAF 会将 Web 请求以其原始状态传递给包含规则，而不进行范围缩小语句的转换。包含范围缩小语句的规则可能会应用自己的文本转换，但它不会从范围缩小语句中继承任何文本转换。

您不能使用范围缩小语句为包含规则语句指定任何请求检查配置。不能将范围缩小语句用作包含规则语句的 Web 请求预处理器。范围缩小语句的唯一作用是确定哪些请求会传递到包含规则语句以进行检查。

# 在中引用可重复使用的实体 AWS WAF
<a name="waf-rule-statement-reusable-entities"></a>

本节介绍了可重用实体在 AWS WAF中的工作方式。

有些规则使用可重复使用的实体，这些实体由您或 AWS Marketplace 卖家在您的网络ACLs之外进行管理。 AWS更新可重用实体时， AWS WAF 会将更新传播到您的规则。例如，如果您在保护包 (Web ACL) 中使用 AWS 托管规则组，则在 AWS 更新规则组时，会将更改 AWS 传播到您的 Web ACL，以更新其行为。如果您在规则中使用 IP 集语句，则在更新该集合时，会将更改 AWS WAF 传播到所有引用该规则的规则，因此使用这些规则的所有保护包 (Web ACLs) 都将 up-to-date与您的更改一起保存。

以下是可在规则语句中使用的可重用实体。
+ **IP 集**：您创建和管理自己的 IP 集。您可以在控制台上从导航窗格访问这些内容。有关管理 IP 集的信息，请参阅 [中的 IP 集和正则表达式模式集 AWS WAF](waf-referenced-set-managing.md)。
+ **正则表达式匹配集**：您创建和管理自己的正则表达式匹配集。您可以在控制台上从导航窗格访问这些内容。有关管理正则表达式模式集的信息，请参阅 [中的 IP 集和正则表达式模式集 AWS WAF](waf-referenced-set-managing.md)。
+ **AWS 托管规则规则组**- AWS 管理这些规则组。当您将托管规则组添加到保护包（web ACL）时，您可以在控制台上使用这些规则组。有关这些规则组的更多信息，请参阅 [AWS 托管规则规则组列表](aws-managed-rule-groups-list.md)。
+ **AWS Marketplace 托管规则组** — AWS Marketplace 卖家管理这些规则组，您可以订阅它们以使用它们。要管理您的订阅，请在控制台的导航窗格中选择 **AWS Marketplace**。当您将 AWS Marketplace 托管规则组添加到保护包 (Web ACL) 时，会列出托管规则组。对于您尚未订阅的规则组，您也可以在该页面 AWS Marketplace 上找到指向的链接。有关 AWS Marketplace 卖家管理的规则组的更多信息，请参阅[AWS Marketplace 规则组](marketplace-rule-groups.md)。
+ **您自己的规则组**：当您需要某些无法通过托管规则组提供的行为时，您通常需要管理自己的规则组。您可以在控制台上从导航窗格访问这些内容。有关更多信息，请参阅 [管理您自己的规则组](waf-user-created-rule-groups.md)。

**删除引用的集合或规则组**  
删除被引用的实体时， AWS WAF 会检查该实体当前是否正在保护包 (Web ACL) 中使用。如果 AWS WAF 发现它正在使用中，它会警告你。 AWS WAF 几乎总是能够确定保护包（Web ACL）是否引用了实体。但是在极少数情况下，它可能无法执行此操作。如果您需要确保要删除的实体未在使用中，请在将其删除ACLs 之前在您的网页中进行检查。