使用欄位、函式和表達式
除了動作之外,欄位和表達式也是 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 定義的欄位:
| 欄位名稱 | 類型 | 範例值 | 附註 |
|---|---|---|---|
| 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 是付費的附加元件,可為您的網域提供精密的殭屍保護。 客戶可以識別自動流量、採取適當行動,並在主控台內檢視詳細分析。
下表提供有關可用機器人欄位的資訊:
| 欄位名稱 | 類型 | 附註 |
|---|---|---|
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)。