使用欄位、函式和表達式

除了動作之外,欄位和表達式也是 WAF 自訂規則的構成要素。 這些元素共同定義自訂規則的匹配條件。

欄位

CIS 收到 HTTP 請求時,會分析該請求,並建立欄位表以進行比對。 此欄位表僅在處理請求時存在,並包含用於表達式匹配的請求屬性。

每個欄位值都可以源自不同位置,例如:

  • 基本元素內容,直接從資料流量中取得 - 例如 http.request.uri.path。
  • 由轉換、組合或基本運算所產生的衍生值——例如,將 http.request.uri.path 的值全部轉為小寫,並作為另一個欄位的子欄位。
  • 電腦值,從查閱、運算或其他情報所產生 - 例如,由檢查相關基本元素和衍生值的機器學習處理程序動態計算的 cf.threat_score。

可用欄位

可用欄位
欄位名稱 類型 範例值 附註
http.cookie 字串 session=A12345;-background=light 作為字串的整個 Cookie
http.host 字串 www.example.com 完整請求 URI 中使用的主機名稱
http.referer 字串 HTTP 引用標頭 Referer HTTP 標頭 request,其中包含連結至當前請求網頁的網頁地址。
http.request.body.raw 字串 未經修改的 HTTP 請求本體。
http.request.full_uri 字串 https://www.example.com/articles/index?section=539061&expand=comments 網頁伺服器接收到的完整 URI(不包含 #fragment,因為該部分不會傳送至網頁伺服器)
http.request.method 字串 POST HTTP 方法,大寫
http.request.uri 字串 /articles/index?section=539061&expand=comments 要求的絕對 URI
http.request.uri.path 字串 /articles/index 要求的路徑
http.request.uri.query 字串 section=539061&expand=comments 整個查詢字串,去掉定界字首 "?"
http.user_agent 字串 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 整個 HTTP 使用者代理程式
http.x_forwarded_for 字串 完整的 X-Forwarded-For HTTP 標頭
ip.src IP 位址 93.155.208.22 客戶端 IP 位址 TCP,可視實際情況調整以反映原始客戶端的真實 IP 位址(例如,透過使用 HTTP 標頭,如 X-Forwarded-For 或 X-Real-IP)
ip.src.region 字串 德克薩斯州 與傳入請求的 IP 位址相關聯的地理位置區域。
ip.src.asnum 號碼 222 自主系統 (AS) 編號
ip.src.country 字串 GB 2 個字母的國家代碼
SSL 布林 是 是否加密用戶端的 HTTP 連線
ip.src.subdivision_1_iso_code 字串 GB-ENG 與 IP 位址相關的 ISO 3166-2 與 IP 位址相關的第一層區域代碼。 當沒有實際值時,此欄位包含空字串。 若要使用此欄位,必須有 CIS 企業方案。
ip.src.subdivision_2_iso_code 字串 GB-SWK 與 IP 位址相關的 ISO 3166-2 與 IP 位址相關聯的第二層區域代碼。 當沒有實際值時,此欄位包含空字串。 若要使用此欄位,必須有 CIS 企業方案。
ip.src.is_in_european_union 布林 如需詳細資訊,請參閱 ip.src.is_in_european_union.

這些標準欄位遵循 Wireshark 顯示欄位參照的命名慣例。 不過,前面的範例值可能存在一些微妙的差異。

除了標準欄位之外,還提供以下由 Cloudflare 定義的欄位:

可用的 Cloudflare 欄位
欄位名稱 類型 範例值 附註
cf.client.bot 布林 是 無論該請求是否來自已知的機器人或爬蟲程式,也不論其意圖是好是壞。
cf.threat_score 號碼 0 此欄位顯示 Cloudflare 威脅分數。 以前,威脅分數代表 Cloudflare 威脅分數從 0-100 到 100,其中 0 代表低風險。 現在,威脅分數永遠是 0 (零)。
cf.waf.score 號碼 1-99 以機器學習為基礎的評分,可估算惡意請求的可能性。 分數範圍從 1 (最有可能是惡意的) 到 99 (最有可能是安全的)。 低分數表示風險較高。 有助於建立基於臨界值的防火牆規則。
cf.ray_id 字串 它是給每個通過 Cloudflare 的請求的識別碼。
cf.edge.server_ip IP 位址 此欄位顯示 HTTP 請求已解析到的全球網路 IP 位址。 此欄位只對 BYOIP 客戶有意義。
cf.edge.server_port IP 位址 1-65535 此欄位表示 Cloudflare 全球網路接收請求的連接埠號。 使用此欄位可過濾特定連接埠上的流量。
cf.tls_cipher 字串 AES128-SHA256 與 Cloudflare 連線的密碼。
cf.tls_version 字串 TLSv1.2 與 Cloudflare 連線的 TLS 版本。

ip.src.is_in_european_union

該請求來自歐盟 (EU) 的一個國家,並且需要 CIS Enterprise 計劃。

下表從地理位置資料列出歐盟國家:

國家代碼和名稱
國碼 國家或地區名稱
AT 奧地利
AX 奧蘭群島
BE 比利時
BG 保加利亞
CY 塞普勒斯
CZ 捷克共和國
GE 德國
DK 丹麥
EE 愛沙尼亞
ES 西班牙
FI 芬蘭
FR 法國
GF 法屬圭亞那
GP 哥德洛普島
GR 希臘
HR 克羅埃西亞共和國
HU 匈牙利
IE 愛爾蘭
IT 義大利
LT 立陶宛
LU 盧森堡
LV 拉脫維亞
MF 聖馬丁
MQ 馬提尼克島
MT 馬爾他
NL 荷蘭
PL 波蘭
PT 葡萄牙
RE 留尼旺島
RO 羅馬尼亞
SE 瑞典
SI 斯洛維尼亞
SK 斯洛伐克
YT 馬約特島

機器人管理領域

Bot Management for Enterprise 是付費的附加元件,可為您的網域提供精密的殭屍保護。 客戶可以識別自動流量、採取適當行動,並在主控台內檢視詳細分析。

下表提供有關可用機器人欄位的資訊:

可用的 Cloufare 殭屍管理欄位
欄位名稱 類型 附註
cf.client.bot 布林 此欄位指出要求是否來自已知機器人或搜索器,不論其意圖好壞。
cf.bot_management.verified_bot 布林 表示請求是否來自已知良好的機器人或爬蟲,並提供與 cf.client.bot 相同的資訊。 此欄位適用於啟用 Bot 管理 的 CIS 企業方案。
cf.bot_management.corporate_proxy 布林 此欄位顯示傳入的要求是否來自已識別的企業專用雲端企業代理或安全網頁閘道。 此欄位適用於啟用 Bot 管理 的 CIS 企業方案。
cf.bot_management.detection_ids 號碼 此欄位列出請求中 Bot Management 啟發式偵測的 ID。 使用此欄位可匹配或排除規則中的特定啟發式。 一個請求可以有多個偵測。
cf.bot_management.ja3_hash 字串 此欄位提供 SSL / TLS 指紋,可協助您識別潛在的殭屍請求。 如需詳細資訊,請參閱 JA3/JA4 指紋。 要使用此欄位,需要啟用 Bot 管理 的 CIS 企業方案。
cf.bot_management.ja4 字串 此欄位提供 SSL / TLS 指紋,可協助您識別潛在的殭屍請求。 如需詳細資訊,請參閱 JA3/JA4 指紋。 要使用此欄位,需要啟用 Bot 管理 的 CIS 企業方案。
cf.bot_management.js_detection.passed 布林 表示訪客之前是否通過 JS Detection。 如需詳細資訊,請參閱 JavaScript 檢測。 要使用此欄位,需要啟用 Bot 管理 的 CIS 企業方案。
cf.bot_management.score 號碼 此欄位使用 1-99 的分數來表示請求源自殭屍的可能性。 低分數表示該請求來自於機器人或自動化代理。 高分表示該請求是由人類發出的。 要使用此欄位,需要啟用 Bot 管理 的 CIS 企業方案。
cf.bot_management.static_resource 號碼 表示當您使用 cf.bot_management.score 建立規則時,是否應該包含靜態資源。 要使用此欄位,需要啟用 Bot 管理 的 CIS 企業方案。
cf.verified_bot_category 字串 此欄位提供已驗證機器人的類型和目的。 如需詳細資訊,請參閱 已驗證的機器人類別。

Functions

CIS 表達式採用 Cloudflare Wirefilter 語法進行格式化。 此表達式語言支援可對從 HTTP 請求中擷取的值進行處理的轉換函式。

這些功能在「表達式建構器」使用者介面中不支援。 您可以透過在「CIS」主控台的「表達式編輯器」中手動輸入這些內容來使用它們。 您也可以在透過 CLI 或 API 建立的規則表達式中使用它們。

規則集引擎的轉換函式
功能 簽章 說明 範例
any any(Array<Boolean>): Boolean 當比較運算子對參數陣列中的任何值返回 true 時,會返回 true 。 any(url_decode(http.request.body.form.values[*])[*] contains "xss")
all all(Array<Boolean>): Boolean 當比較運算子對參數陣列中的所有值皆返回 true 時,會返回 true 。 all(http.request.headers["content-type"][*] == "application/json")
concat concat(String | Bytes | Array): String | Array 將參數值串接成單一字串或陣列。 concat("foo", "-", "bar") returns "foo-bar"
ends_with ends_with(source String, substring String): Boolean 當來源以指定的子字串結尾時,會傳回 true。 來源不能是字面值。 ends_with(http.request.uri.path, ".html")
len len(String | Bytes | Array): Integer 回傳字串或 bytes 值的位元組長度,或是陣列中的元素個數。 len(http.host) 11 當主機為 "example.com"
lower lower(String): String 將字串欄位轉換為小寫。 僅轉換大寫的 ASCII 位元組。 其餘所有位元組均不受影響。 lower(http.host) == "www.example.com"
lookup_json_integer lookup_json_integer(field String, key String | Integer, ...): Integer 返回 JSON 欄位中與所提供的金鑰相關聯的整數值。 lookup_json_integer(http.request.body.raw, "version") returns 2
lookup_json_string lookup_json_string(field String, key String | Integer, ...): String 回傳 JSON 欄位中與所提供的金鑰相關聯的字串值。 lookup_json_string(http.request.body.raw, "company") == "example"
remove_bytes remove_bytes(Bytes): Bytes 回傳一個新的位元組陣列,其中已移除所有指定位元組的出現位置。 remove_bytes(http.host, "\x2e\x77")
starts_with starts_with(source String, substring String): Boolean 當來源字串以指定的子字串開頭時,會傳回 true。 來源不能是字面值。 starts_with(http.request.uri.path, "/blog")
substring substring(field String | Bytes, start Integer [, end Integer]): String 返回從起始位元組索引開始,至結束位元組索引(不包含該索引)為止的欄位值。 支援負索引,以便從字串末尾開始計數。 substring(http.request.uri.path, 0, 5)
to_string to_string(Integer | Boolean | IP address): String 回傳整數、布林值或 IP 位址值的字串表示形式。 to_string(cf.threat_score) returns "10"
upper upper(String): String 將字串欄位轉換為大寫。 僅轉換小寫的 ASCII 位元組。 其餘所有位元組均不受影響。 upper(http.host) returns "WWW.CLOUDFLARE.COM"
url_decode url_decode(source String [, options String]): String 解碼以 URL 格式編寫的字串。 來源必須是一個欄位,而非字面值。 支援可選的 "r" (遞迴)和 "u" (Unicode)標誌。 url_decode(http.request.uri.path)

表示式

表示式根據與送入資料流量的相符項傳回 true 或 false。 例如:

http.host eq "www.example.com" and ip.src in 92.182.212.0/24

在此範例中,兩個單一表達式組成了一個複合表達式。 請將每個單一表示式視為一個條件。 每個條件都會分別進行評估,然後再套用任何邏輯以判定複合表示式的最終結果。

觀察第一個單一表達式,你可以看到它包含:

  • 欄位 - http.host
  • 比較運算子 - eq
  • 值 - "www.example.com"

並非所有狀況都有相同的結構。 下節會討論使用不同結構的其他範例。

比較運算子

下列比較運算子可用於表示式:

表達式的比較運算符號
英文 C 樣式 說明
eq == 等於
ne != 不等於
lt < 小於
le <= 小於或等於
gt
大於
ge ≥ 大於或等於
contains 確切包含
符合 ~ Re2 激發的正規表示式
於 值出現在一組值中。 支援使用「..」表示法指定範圍。
not ! 請參閱「布林比較」
bitwise_and & 比較位元欄位值

目前 Expression Builder 只支援英文運算符號。

一個表達式可能同時包含英文運算子與 C 語言風格的運算子。 例如,ip.src eq 93.184.216.34 相當於 ip.src == 93.184.216.34。

特定比較運算子適用於根據類型的特定欄位。 下列矩陣提供可用於各種欄位類型的運算子範例:

欄位的比較運算符號
英文 C 樣式 字串 IP 位址 號碼
eq == http.request.uri.path eq "/articles/2008/" ip.src eq 93.184.216.0 cf.threat_score eq 10
ne != http.request.uri.path ne "/articles/2010/" ip.src ne 93.184.216.0 cf.threat_score ne 60
lt < http.request.uri.path lt "/articles/2009/" cf.threat_score lt 10
le <= http.request.uri.path le "/articles/2008/" cf.threat_score le 20
gt
http.request.uri.path gt "/articles/2006/" cf.threat_score gt 25
ge ≥ 大於或等於 cf.threat_score ge 60
contains http.request.uri.path contains "/articles/"
符合 ~ http.request.uri.path ~ "^/articles/200[7-8]/$"
於 http.request.method in { "HEAD" "GET" } ip.src in { 93.184.216.0 93.184.216.1 } cf.threat_score in {0 2 10}

對使用字串值的表示式評估區分大小寫。 因此,自訂規則可能需要您定義多於一個的測試條件。 企業客戶可以使用包含 matches 運算子的正規表示式,以使用單一表示式來擷取多個變異。

布林比較

對於布林類型的欄位(例如,ssl),評估 true 條件時,該欄位本身會出現在表示式中。 對於 false 條件,會套用 not 運算子。

布林比較
是 否
SSL not ssl

複合表達式

您可以使用邏輯運算子將兩個以上的單一表示式群組在一起,以建立複合表示式。

複合表達式
英文 C 樣式 說明 範例 優先順序
not ! 邏輯 NOT not ( http.host eq "www.example.com" and ip.src in 93.184.216.0/24 ) 1
和 && 邏輯 AND http.host eq "www.example.com" and ip.src in 93.184.216.0/24 2
xor ^^ 邏輯 XOR http.host eq "www.example.com" xor ip.src in 93.184.216.0/24 3
或 || 邏輯 OR http.host eq "www.example.com" or ip.src in 93.184.216.0/24 4

若要變更優先順序,您可以使用括弧將表示式分組。 不使用括弧時,表示式會根據標準優先順序隱含地分組:

ssl and http.request.uri.path eq /login or http.request.uri.path eq /oauth

套用明確分組:

(ssl and http.request.uri.path eq /login) or http.request.uri.path eq /oauth

給定優先順序或使用括弧給定優先順序:

ssl and (http.request.uri.path eq /login or http.request.uri.path eq /oauth)

請注意,雖然 not 用於分組,但只能用於使單一比較無效。 例如,not ip.src eq 93.184.216.0 相當於 not (ip.src eq 93.184.216.0)。

最後,您也可以使分組表示式無效:

not (http.request.method eq "POST" and http.request.uri.path eq "/login")

與 Wireshark 顯示過濾器的偏差

自訂規則表達式是參考 Wireshark 的顯示篩選器所設計的。 不過,實作在下列方面有所偏差:

  • 對於 CIDR IP 相等測試,Wireshark 容許使用格式為 ip.src == 1.2.3.0/24 的範圍,而 CIS 僅支援使用單一 IP 位址進行相等測試。 若要比較 CIDR,請使用 in 運算子;例如,ip.src in {1.2.3.0/24}。
  • 在 Wireshark 中,ssl 是一個通訊協定欄位,包含各種類型的數百個其他欄位可用於在多個方面進行比較。 然而,在自訂規則中,「ssl」是一個單一的布林型欄位,用於判斷從客戶端到 CIS 的連線是否經過加密。
  • 不支援 slice 運算子。
  • 未支援所有函數。 目前不支援 len(),和 count()。

表達限制

以下限制適用於規則表達式:

  • 一個規則表達式最多可包含 4,096 個字元。

    若您在使用者介面中使用「表達式建構器」,生成的表達式預覽同樣受此限制。

  • 一個規則表達式最多可包含 64 個正規表達式 (regex)。