

**推出 的新主控台體驗 AWS WAF**

您現在可以使用更新後的體驗，在主控台的任何位置存取 AWS WAF 功能。如需詳細資訊，請參閱[使用 主控台](https://docs.aws.amazon.com/waf/latest/developerguide/working-with-console.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 動態標籤插補
<a name="waf-dynamic-label-interpolation"></a>

動態標籤插補可讓您使用`${namespace:}`語法直接在自訂請求標頭、自訂回應標頭和自訂回應內文中嵌入標籤值。 會根據附加至請求的標籤，在評估時間 AWS WAF 解析每個預留位置，因此您不需要為每個標籤值撰寫單獨的規則。

插補可在沒有新欄位或組態步驟的現有 AWS WAF API 內運作。您可以在現有的字串值中使用預留位置語法。現有的靜態標頭值會繼續保持不變。插入只會在值包含 `${namespace:}` 子句時啟用。

## 支援插補的位置
<a name="waf-interpolation-where-supported"></a>

您可以在下列位置使用`${namespace:}`插補：
+ **自訂請求標頭** – 將解析的標籤值插入轉送至原始伺服器的標頭。使用標頭值欄位中的`${namespace:}`語法。
+ **自訂回應內文** – 在區塊頁面、挑戰頁面和其他自訂回應中嵌入標籤值和合成標籤。使用回應內文內容欄位中的`${namespace:}`語法。
+ **自訂回應標頭** – 將標籤值插入回應標頭，例如在重新導向的`Location`標頭中。使用回應標頭值欄位中的`${namespace:}`語法。

## 插補語法和解析度
<a name="waf-interpolation-syntax"></a>

若要使用插補，請在標頭值或自訂回應內文內容中包含 `${namespace:}`子句。結尾的冒號很重要。它會通知 AWS WAF 解析該命名空間中的所有標籤，而不是比對單一標籤。

AWS WAF 會在評估時間使用以下規則解析每個子句：

1. **單一標籤比對** – 子句解析為標籤的終端機值。例如，如果請求具有標籤 `awswaf:managed:aws:bot-control:bot:category:scraping`，則 子句會`${awswaf:managed:aws:bot-control:bot:category:}`解析為 `scraping`。

1. **多個標籤** – 當多個標籤符合命名空間時，值會以逗號分隔的清單傳回，並分割命名空間字首。例如 `scraping,advertising`。

1. **不相符** – 子句解析為空字串。

**注意**  
單一字串值最多支援 10 個`${namespace:}`預留位置。如果值包含超過 10 個預留位置， 會 AWS WAF 解析前 10 個預留位置，並將輸出中的任何其他預留位置保留為文字`${namespace:}`。此限制適用於每個字串值，而不是每個請求。您可以在多個標頭中每個標頭中使用最多 10 個預留位置，而不會發生問題。

**重要**  
自訂標籤使用 中的簡短名稱`ruleLabels`。例如 `app:tier:enterprise`。不過， AWS WAF 會自動在簡短名稱前加上保護套件 (Web ACL) 內容，產生完整標籤。例如 `awswaf:{{ACCOUNT_ID}}:webacl:{{WEBACL_NAME}}:app:tier:enterprise`。標籤比對陳述式適用於短命名空間，但插入參考必須一律使用完整的命名空間。

## 合成標籤
<a name="waf-interpolation-synthetic-labels"></a>

插補也支援合成標籤。這些是從請求內容而非標籤存放區解析的內建值 AWS WAF 。您可以在相同的值字串中結合合成標籤與命名空間型標籤。


| 合成標籤 | 說明 | 
| --- | --- | 
| ${awswaf:request\_id:} | 唯一的 AWS WAF 請求識別符。 | 
| ${awswaf:ip:} | 用戶端 IP 地址。 | 
| ${awswaf:ja3:} | JA3 TLS 指紋。 | 
| ${awswaf:ja4:} | JA4 TLS 指紋。 | 

## 動態標籤插補範例
<a name="waf-interpolation-examples"></a>

**具有動態標頭的應用程式訊號**  
下列規則會將數個 Bot Control 訊號命名空間轉送至原始伺服器，做為個別的標頭。一個規則涵蓋整個命名空間，因此當受管規則群組新增標籤時，您不需要更新規則。

```
{
  "Name": "forward-waf-signals",
  "Statement": {
    "LabelMatchStatement": {
      "Scope": "NAMESPACE",
      "Key": "awswaf:managed:aws:bot-control:bot:category:"
    }
  },
  "RuleAction": {
    "Count": {
      "CustomRequestHandling": {
        "InsertHeaders": [
          { "Name": "bot-category",
            "Value": "${awswaf:managed:aws:bot-control:bot:category:}" },
          { "Name": "bot-name",
            "Value": "${awswaf:managed:aws:bot-control:bot:name:}" },
          { "Name": "bot-signals",
            "Value": "${awswaf:managed:aws:bot-control:signal:}" },
          { "Name": "client-ip",
            "Value": "${awswaf:ip:}" }
        ]
      }
    }
  }
}
```

`bot-signals` 標頭 （輸出：`x-amzn-waf-bot-signals`) 示範多值解析。`signal:` 命名空間可能包含多個標籤，例如 `non_browser_user_agent,automated_browser`，解析為逗號分隔清單。`client-ip` 標頭 （輸出：`x-amzn-waf-client-ip`) 使用合成標籤。

**具有偵錯資訊的自訂封鎖頁面**  
合成標籤可讓您建置包含請求特定內容的區塊頁面。直接將用戶端的 IP 地址和 AWS WAF 請求 ID 嵌入回應內文中，以便在使用者回報誤報時提供可共用的內容。

```
{
  "CustomResponseBodies": {
    "BlockPage": {
      "Content": "Your request was blocked.\n\nIP: ${awswaf:ip:}\nRequest ID: ${awswaf:request_id:}\n\nIf you believe this is an error, contact support with the Request ID above.",
      "ContentType": "TEXT_PLAIN"
    }
  }
}
```

**自訂標籤插補**  
插補適用於任何標籤命名空間，包括您在自己的規則中定義的自訂標籤。下列範例會依 API 金鑰分類請求，並將層值轉送至原始伺服器。

**規則 1：根據 API 金鑰分類層**  
此規則會比對具有企業 API 金鑰的請求，並套用自訂標籤。

```
{
{
  "Name": "classify-tier",
  "Priority": 100,
  "Statement": {
    "ByteMatchStatement": {
      "SearchString": "pk_enterprise_",
      "FieldToMatch": { "SingleHeader": { "Name": "x-api-key" } },
      "PositionalConstraint": "STARTS_WITH",
      "TextTransformations": [{ "Priority": 0, "Type": "NONE" }]
    }
  },
  "RuleLabels": [{ "Name": "app:tier:enterprise" }],
  "Action": { "Count": {} }
}

}
```

**規則 2：轉送已解析的層值**  
此規則符合`app:tier`命名空間中的任何標籤，並將解析的值轉送為標頭。

```
{
{
  "Name": "forward-tier",
  "Priority": 200,
  "Statement": {
    "LabelMatchStatement": {
      "Scope": "NAMESPACE",
      "Key": "app:tier:"
    }
  },
  "Action": {
    "Count": {
      "CustomRequestHandling": {
        "InsertHeaders": [{
          "Name": "customer-tier",
          "Value": "${awswaf:{{ACCOUNT_ID}}:webacl:{{WEBACL_NAME}}:app:tier:}"
        }]
      }
    }
  }
}
```

第一個規則會套用標籤 `app:tier:enterprise`。第二個規則符合`app:tier`命名空間中的任何標籤，並將解析的值轉送為 `customer-tier` 標頭。輸出標頭名稱為 `x-amzn-waf-customer-tier`。您可以為其他層新增更多分類規則，例如 `app:tier:standard`或 `app:tier:trial`。轉送規則會挑選它們，而不會進行任何變更。

如需示範所有這些模式的可部署範例，請參閱 GitHub 上的[AWS WAF 動態標籤插補範例](https://github.com/aws-samples/sample-aws-waf-dynamic-labels)。