INTEGRITY Dokumentace

Operátory a seskupovací symboly

Cloudflare Rules language podporuje porovnávací a logické operátory:

Symboly seskupení umožňují organizovat výrazy, vynucovat prioritu a vnořovat výrazy.

Porovnávací operátory

Operátory porovnání vracejí true pokud hodnota z HTTP požadavku odpovídá hodnotě definované ve výrazu.

Toto je obecný vzor pro použití porovnávacích operátorů:

<field> <comparison_operator> <value>

Rules language podporuje tyto porovnávací operátory:

NázevZápis operátorůPodporované datové typy
AngličtinaStyl jazyka CŘetězec1IPČísloPříklad (operátor tučně)
Stejné jakoeq==✅✅✅http.request.uri.path eq "/articles/2008/"
Nerovná sene!=✅✅✅ip.src ne 203.0.113.0
Less thanlt<✅❌✅cf.waf.score lt 10
Less than
nebo rovno
le<=✅❌✅cf.waf.score le 20
Větší nežgt>✅❌✅cf.waf.score gt 25
Větší než
nebo rovno
ge>=✅❌✅cf.waf.score ge 60
Obsahujecontains✅❌❌http.request.uri.path contains "/articles/"
Zástupný znak
(nerozlišuje velká a malá písmena)
wildcard✅❌❌http.request.uri.path wildcard "/articles/*"
Striktní zástupný znak
(rozlišuje velká a malá písmena)
strict wildcard✅❌❌http.request.uri.path strict wildcard "/AdminTeam/*"
Shody
regulární výraz
2
matches~✅❌❌http.request.uri.path matches "^/articles/200[7-8]/$"
Je v množině hodnot / seznamu3in✅✅✅ip.src in { 203.0.113.0 203.0.113.1 }
ip.src.asnum in $<LIST>

1 Všechny řetězcové operátory rozlišují velká a malá písmena, pokud není výslovně uvedeno, že nerozlišují, jako například wildcard operátor.
2 Přístup k matches operátor vyžaduje plán Cloudflare Business nebo Enterprise.
3 V současnosti ne všechny produkty Cloudflare podporují seznamy ve svých výrazech. Další informace o seznamech najdete v Vložené seznamy a Seznamy.

Další operátory v dashboardu Cloudflare

V závislosti na konkrétním poli a typu pravidla může dashboard Cloudflare zobrazit následující další operátory:

Porovnávání řetězcových hodnot

Porovnávání řetězců ve výrazech pravidel rozlišuje velká a malá písmena. Pro zohlednění možných variant velikosti písmen ve výrazu můžete použít lower() a výsledek porovnat s řetězcem psaným malými písmeny, jak ukazuje následující příklad:

lower(http.request.uri.path) contains "/wp-login.php"

Porovnávání se zástupnými znaky je podporováno pouze s wildcard a strict wildcard operátory a porovnávání pomocí regulárních výrazů je podporováno pouze s matches operátor.

Porovnávání se zástupnými znaky

wildcard operátor provádí porovnání nerozlišující velikost písmen mezi hodnotou pole a doslovným řetězcem obsahujícím nula nebo více * metaznaky. Každý * metaznak představuje nula nebo více znaků. strict wildcard operátor provádí podobné porovnání, ale rozlišuje velikost písmen.

Při použití wildcard/strict wildcard operátor musí celá hodnota pole odpovídat doslovnému řetězci se zástupnými znaky (doslovnému řetězci za operátorem).

Příklad A
# The following expression:
http.request.full_uri wildcard "http*://example.com/a/*"

# Would match the following URIs:
# - https://example.com/a/           (the '*' matches zero characters)
# - http://example.com/a/
# - https://example.com/a/page.html
# - https://example.com/a/sub/folder/?name=value

# Would NOT match the following URIs:
# - https://example.com/ab/
# - https://example.com/b/page.html
# - https://sub.example.com/a/

Příklad B

# The following expression:
http.request.full_uri wildcard "*.example.com/*/page.html"

# Would match the following URIs:
# - http://sub.example.com/folder/page.html
# - https://admin.example.com/team/page.html
# - https://admin.example.com/team/subteam/page.html

# Would NOT match the following URIs:
# - https://example.com/ab/page.html                   ('*.example.com' matches only subdomains)
# - https://sub.example.com/folder2/page.html?s=value  (http.request.full_uri includes the query string and its full value does not match)
# - https://sub.example.com/a/                         ('page.html' is missing)

Lomítka (/) nemají ve shodách se zástupnými znaky žádný speciální význam. V tomto příkladu druhý * metaznak ve výrazu http.request.full_uri wildcard "*.example.com/*/page.html" odpovídalo folder, team, a team/subteam.

Příklad C

# The following expression:
http.request.full_uri wildcard "*.example.com/*" or http.request.full_uri wildcard "http*://example.com/*"

# Would match the following URIs:
# - https://example.com/folder/list.htm
# - https://admin.example.com/folder/team/app1/
# - https://admin.example.com/folder/team/app1/?s=foobar

Algoritmus porovnávání použitý v wildcard operátor nerozlišuje velká a malá písmena. Pro porovnávání se zástupnými znaky rozlišující velikost písmen použijte strict wildcard operátor.

Chcete-li zadat literál * znak v literálovém řetězci se zástupnými znaky musíte escapovat pomocí \*. Kromě toho musíte také escapovat \ pomocí \\. Dva neescapované * znaků po sobě (**) v literálovém řetězci se zástupnými znaky jsou považovány za neplatné a nelze je použít. Pokud potřebujete provést escapování znaků, doporučujeme použít syntaxe surových řetězců k zadání doslovného řetězce se zástupnými znaky.

Porovnávání pomocí regulárních výrazů

Zákazníci s plány Business a Enterprise mají přístup k matches operátor. Porovnávání pomocí regulárních výrazů se provádí pomocí enginu regulárních výrazů jazyka Rust.

Pokud používáte regulární výraz, můžete jej otestovat pomocí nástroje, jako je Regular Expressions 101 ↗ nebo Rustexp ↗.

Další informace o regulárních výrazech najdete v Řetězcové hodnoty a regulární výrazy.

Logické operátory

Logické operátory kombinují dva nebo více výrazů do jednoho složeného výrazu. Složený výraz má obecně tuto syntaxi:

<expression> <logical_operator> <expression>

Podporované logické operátory

Každý logický operátor má pořadí priority. Pořadí priority (spolu s seskupovací symboly) určuje pořadí, ve kterém Cloudflare vyhodnocuje logické operátory ve výrazu. not operátor má v pořadí priority první místo.

NázevAngličtina
Notace
Styl jazyka C
Notace
PříkladPořadí priority
Logický NOTnot!not ( http.host eq "www​.cloudflare​.com" and ip.src in {203.0.113.0/24} )1
Logický ANDand&&http.host eq "www​.cloudflare​.com" and ip.src in {203.0.113.0/24}2
Logické XOR
(exkluzivní OR)
xor^^http.host eq "www​.cloudflare​.com" xor ip.src in {203.0.113.0/24}3
Logický ORor||http.host eq "www​.cloudflare​.com" or ip.src in 203.0.113.0/244

Pořadí priority

Při psaní složených výrazů je důležité znát prioritu logických operátorů, aby se váš výraz vyhodnotil tak, jak očekáváte.

Uvažujme například následující obecný výraz, který používá and a or operátory:

Expression1 and Expression2 or Expression3

Kdyby tyto operátory neměly stanovené pořadí vyhodnocování, nebylo by jasné, která ze dvou interpretací je správná:

  1. Shoda platí, pokud jsou pravdivé výraz 1 i výraz 2 nebo pokud je výraz 3 pravdivý.
  2. Shoda platí, pokud je výraz 1 pravdivý a je pravdivý výraz Expression 2 nebo Expression 3.

Vzhledem k tomu, že logický and operátor má přednost před logickým or, and operátor se musí vyhodnotit jako první. Výklad 1 je správný.

Abyste se při práci s logickými operátory vyhnuli nejednoznačnosti, použijte seskupovací symboly, aby bylo pořadí vyhodnocování jednoznačné.

Symboly seskupení

Rules language podporuje závorky ((,)) jako seskupovací symboly. Seskupovací symboly umožňují uspořádat výrazy, vynutit prioritu a vnořovat výrazy.

Pouze Expression Editor a Cloudflare API podporují seskupovací symboly. Expression Builder ne.

Seskupování výrazů

Pomocí závorek můžete explicitně seskupit výrazy, které mají být vyhodnoceny společně. V tomto příkladu závorky nemění způsob vyhodnocení výrazu, ale jednoznačně určují, které logické operátory se mají vyhodnotit jako první.

(Expression1 and Expression2) or Expression3

Seskupovací symboly jsou natolik jednoznačné, že při jejich použití ve složených výrazech snáze předejdete chybám.

Vynucení priority

Symboly seskupení jsou účinným nástrojem pro vynucení priority seskupených prvků složeného výrazu. V tomto příkladu závorky vynucují, aby logický or operátor byl vyhodnocen dříve než logický and:

Expression1 and (Expression2 or Expression3)

Bez závorek logický and operátor by měl přednost.

Vnořit výrazy

Výrazy seskupené závorkami můžete vnořovat do jiných skupin a vytvářet tak velmi přesné a propracované výrazy, jako je tento příklad pravidla určeného k blokování přístupu k doméně:

(
 (http.host eq "api.example.com" and http.request.uri.path eq "/api/v2/auth") or
 (http.host matches "^(www|store|blog)\.example\.com" and http.request.uri.path contains "wp-login.php") or
 ip.src.country in {"CN" "TH" "US" "ID" "KR" "MY" "IT" "SG" "GB"} or ip.src.asnum in {12345 54321 11111}
) and not ip.src in {11.22.33.0/24}

Při vyhodnocování priority logických operátorů se ignorují závorky uvnitř řetězců ohraničených uvozovkami, jako je tomu v následujícím regulárním výrazu převzatém z výše uvedeného příkladu:

"^(www|store|blog)\.example\.com"