Informazioni sulle condizioni
Comprendere e comporre le condizioni per le regole associate ai criteri WAF.
WAF utilizza il linguaggio JMESPath come linguaggio di condizione della regola. JMESPath è un linguaggio di query per JSON (vedere https://jmespath.org/specification.htmlJMESPath selectors) che è possibile utilizzare per scrivere espressioni JMESPath, in cui ogni espressione accetta un documento JSON come input (il documento di input) e restituisce un documento JSON trasformato o nuovo (il documento di output).
In WAF, ogni regola accetta un'espressione JMESPath come condizione. Le richieste HTTP o le risposte HTTP (a seconda del tipo di regola) attivano le regole WAF. Quando valuta una regola, il servizio WAF valuta l'espressione JMESPath (la condizione) della regola e fornisce un documento JSON di input, che include i dettagli della richiesta HTTP o della risposta HTTP che ha attivato la valutazione. Il risultato dell'espressione JMESPath valutata viene quindi utilizzato per determinare se eseguire o meno l'azione specificata nella regola.
Il valore restituito delle condizioni JMESPath in WAF viene convertito in un valore booleano. I seguenti valori vengono convertiti in "false":
- Lista vuota: []
- Oggetto vuoto: {}
- Stringa vuota: ""
- Falso booleano: falso
- Valore nullo: nullo
È possibile creare una condizione JMESPath con un massimo di 1.024 caratteri.
Esempio
Condizioni percorso URL
# URL path equals
http.request.url.path == '/example/path'
# URL path does not equal
http.request.url.path != '/example/path'
# URL path contains
contains(http.request.url.path, 'example')
# URL path does not contain
!contains(http.request.url.path, 'example')
# URL path starts with
starts_with(http.request.url.path, '/example/path')
# URL path ends with
ends_with(http.request.url.path, '.png')
# HTTP request method is one of
contains(['GET', 'POST'], http.request.method)
Condizioni dell'intestazione della richiesta HTTP
# HTTP request header exists
contains(keys(http.request.headers), 'example-header')
# HTTP request header has specific value
http.request.headers."example-header"[0] == 'specific-value'
# One of the HTTP request headers with the same name has a specific value
contains(http.request.headers."example-header", 'specific-value')
Condizioni multiple
# HTTP request method is GET and URL path starts with /example/path
http.request.method == 'GET' && starts_with(http.request.url.path, '/example/path')
# URL path starts with /example/path_one or /example/path_two
starts_with(http.request.url.path, '/example/path_one') || starts_with(http.request.url.path, '/example/path_two')
# HTTP request method is POST and URL is either /example/path_one or /example/path_two
http.request.method == 'POST' && (http.request.url.path == '/example/path_one' || http.request.url.path == '/example/path_two')
Struttura documento JSON di input
Quando si valutano le espressioni JMESPath, WAF fornisce un documento JSON di input, che include i dettagli della richiesta HTTP o della risposta HTTP che ha attivato la valutazione. Il documento JSON di input è sempre un oggetto JSON.
Esempio
Per una richiesta HTTP con i seguenti dettagli:
-
Indirizzo IP e porta di origine: 129.146.10.1:48152
-
Codice paese a cui appartiene l'indirizzo IP di origine: USA
-
ASN a cui appartiene l'indirizzo IP di origine: 31898
-
Indirizzo IP e porta di destinazione: 205.147.88.0:80
-
Host di destinazione: example.com
-
Protocollo: HTTP/1.1
GET /test/path/img.jpg?param1=a&m2=b HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: cookie1=A; cookie2=B; cookie3=3C; cookie3=3D
Host: example.com
User-Agent: HTTPie/2.4.0
Il seguente documento di input JSON viene generato e passato alle espressioni JMESPath:
{
"connection": {
"source": {
"address": "129.146.10.1",
"port": 49152,
"geo": {
"countryCode": "US"
},
"routing": {
"asn": 31898
}
},
"destination": {
"address": "205.147.88.0",
"port": 80
},
"protocol": "http"
},
"http": {
"request": {
"host": "www.example.com",
"method": "GET",
"version": "1.1",
"url": {
"path": "/test/path/img.jpg",
"query": "param1=a¶m2=b",
"queryParameters": {
"param1": ["a"],
"param2": ["b"]
},
"queryPrefix": "?"
},
"headers": {
"accept": ["*/*"],
"accept-encoding": ["gzip, deflate"],
"connection": ["keep-alive"],
"cookie": [
"cookie1=A; cookie2=B; cookie3=3C; cookie3=3D"
],
"host": ["www.example.com"],
"user-agent": ["HTTPie/2.4.0"]
},
"cookies": {
"cookie1": ["A"],
"cookie2": ["B"],
"cookie3": ["3C", "3D"]
}
}
}
}
Di riferimento
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Stringa contenente l'indirizzo IP di origine TCP. IPv6 gli indirizzi sono rappresentati nella loro forma canonica, secondo RFC 5952. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"10.0.0.1", "1.2.3.4" |
Categoria |
Valore |
---|---|
Digitare |
numerica |
descrizione; |
Porta di origine TCP |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
49152 |
Categoria |
Valore |
---|---|
Digitare |
stringa | null |
descrizione; |
Codice ISO 3166-1 alpha-2 del paese a cui appartiene l'indirizzo IP di origine. Può essere nullo se il paese non è noto. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"US" |
Categoria |
Valore |
---|---|
Digitare |
numero | nullo |
descrizione; |
ASN (numero di sistema autonomo) a cui appartiene l'indirizzo IP di origine. Può essere nullo quando l'indirizzo IP è privato. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
2122, 1278 |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Stringa contenente l'indirizzo IP di destinazione TCP. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"10.0.0.1" |
Categoria |
Valore |
---|---|
Digitare |
numerica |
descrizione; |
Porta di destinazione TCP |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
80 |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Il protocollo della connessione, sia "http" che "https". |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"https" |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Il valore dell'intestazione "Host" della richiesta HTTP. L'intestazione della richiesta "Host" specifica il numero di host e di porta del server a cui viene inviata la richiesta. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"http://www.example.com", "api.example.com:8080" |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Metodo di richiesta HTTP |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"GET", "POST" |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Versione protocollo HTTP |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"1.1", "2.0" |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
La parte del percorso assoluto della destinazione della richiesta HTTP. Non include la parte della query. Inizia sempre con un "/". |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"/api/v1", "/index.html", "/" |
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Parametri di query della destinazione della richiesta HTTP, senza il prefisso. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"foo=bar&multi=1&multi=2", "multi=one&multi=two&multi=3&encoded=two%20words", "" |
Categoria |
Valore |
||||||
---|---|---|---|---|---|---|---|
Digitare |
oggetto |
||||||
descrizione; |
Parte della query della destinazione della richiesta HTTP, analizzata in una struttura di oggetti, dove:
Le chiavi e i valori non vengono escape in base alle regole di escape URL. |
||||||
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||||
Valori di esempio |
|
Categoria |
Valore |
---|---|
Digitare |
stringa |
descrizione; |
Prefisso di query della destinazione della richiesta HTTP. Se è presente una stringa di query, è sempre "?". Se non è presente alcuna stringa di query, questa contiene una stringa vuota. |
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valori di esempio |
"?", "" |
Categoria |
Valore |
||||
---|---|---|---|---|---|
Digitare |
oggetto |
||||
descrizione; |
Intestazioni di richiesta HTTP analizzate in una struttura di oggetti, dove:
|
||||
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Valori di esempio |
|
Categoria |
Valore |
||||
---|---|---|---|---|---|
Digitare |
oggetto |
||||
descrizione; |
I cookie HTTP che sono stati passati utilizzando l'intestazione di richiesta HTTP "Cookie", analizzati in una struttura di oggetti, dove:
|
||||
Disponibile in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Valori di esempio |
|
Categoria |
Valore |
---|---|
Digitare |
numerica |
descrizione; |
Codice risposta HTTP |
Disponibile in |
responseAccessControl, responseProtection |
Valori di esempio |
200 |
Categoria |
Valore |
||||
---|---|---|---|---|---|
Digitare |
oggetto |
||||
descrizione; |
Le intestazioni di risposta HTTP analizzate in una struttura di oggetti, dove:
|
||||
Disponibile in |
responseAccessControl, responseProtection |
||||
Valori di esempio |
|
Corrispondenza stringa con distinzione tra maiuscole e minuscole
Oltre alle funzioni di corrispondenza delle stringhe supportate per impostazione predefinita in JMESPath, WAF aggiunge il supporto per quattro funzioni che possono corrispondere alle stringhe senza distinzione tra maiuscole e minuscole:
- i_uguale (variante senza distinzione tra maiuscole e minuscole dell'operatore ==);
- i_contains (variante senza distinzione tra maiuscole e minuscole della funzione Contiene);
- i_starts_with (variante senza distinzione tra maiuscole e minuscole della funzione starts_with);
- i_ends_with (variante senza distinzione tra maiuscole e minuscole della funzione ends_with).
i_uguale a
boolean i_equals(string $left, string $right)
Restituisce true se le stringhe $left e $right sono uguali, se confrontate senza distinzione tra maiuscole e minuscole (sia le stringhe $left che $right vengono convertite in minuscole, solo le lettere inglesi vengono convertite in minuscole). In caso contrario restituisce false.Fornito | Espressione | Risultati |
---|---|---|
"stringa" | i_equals(@, 'string') | true |
"stringa" | i_equals(@, 'STRING') | true |
"stringa" | i_uguali(@, 'sTrInG') | true |
"STRINGA" | i_equals(@, 'string') | true |
"stringa" | i_uguali(@, 'other_string') | false |
i_contiene
boolean i_contains(array|string $subject, any $search)
Variante senza distinzione tra maiuscole e minuscole della funzione Contiene.Se $subject fornito è una stringa, questa funzione restituisce true se la stringa contiene l'argomento $search fornito, se confrontata senza distinzione tra maiuscole e minuscole (sia le stringhe $left che $right vengono convertite in minuscole, solo le lettere inglesi vengono convertite in minuscole). In caso contrario, questa funzione restituisce false.
Se $subject è un array, questa funzione restituisce true se almeno uno degli elementi dell'array è uguale al valore $search fornito, altrimenti restituisce false.
Se $search è una stringa - il confronto viene eseguito utilizzando la stessa logica della funzione i_equals(): confronto senza distinzione tra maiuscole e minuscole (sia l'elemento array $subject che le stringhe $search vengono convertite in minuscole, solo le lettere inglesi vengono convertite in minuscole).
Se $search non è una stringa, il confronto viene eseguito utilizzando l'operatore standard ==.
Fornito | Espressione | Risultati |
---|---|---|
"foobarbaz" | i_contains(@, 'bar') | true |
"foobarbaz" | i_contains(@, 'BAR') | true |
"foobarbaz" | i_contains(@, 'bAr') | true |
"foobarbaz" | i_contains(@, 'foo') | false |
["a", "b"] | i_contains(@, `a`) | true |
["foo", "bar"] | i_contains(@, `b`) | false |
["foo", "bar"] | i_contains(@, `BAR`) | true |
i_start_con
boolean i_starts_with(string $subject, string $prefix)
Restituisce true se il soggetto $ inizia con il prefisso $, se confrontato senza distinzione tra maiuscole e minuscole (sia le stringhe $left che $right vengono convertite in minuscole, solo le lettere inglesi vengono convertite in minuscole). In caso contrario, questa funzione restituisce false.Fornito | Espressione | Risultati |
---|---|---|
"foobarbaz" | i_starts_with(@, 'foo') | true |
"foobarbaz" | i_starts_with(@, 'FOO') | true |
"foobarbaz" | i_starts_with(@, 'fOo') | true |
"foobarbaz" | i_starts_with(@, 'bar') | false |
i_end_con
boolean i_ends_with(string $subject, string $suffix)
Restituisce true se il $subject termina con il $suffix, se confrontato senza distinzione tra maiuscole e minuscole (sia le stringhe $left che $right vengono convertite in minuscole, solo le lettere inglesi vengono convertite in minuscole). In caso contrario, questa funzione restituisce false.Fornito | Espressione | Risultati |
---|---|---|
"foobarbaz" | i_ends_with(@, 'baz') | true |
"foobarbaz" | i_ends_with(@, 'BAZ') | true |
"foobarbaz" | i_ends_with(@, 'bAz') | true |
"foobarbaz" | i_ends_with(@, 'bar') | false |
Corrispondenza indirizzo IP
WAF aggiunge il supporto per più funzioni che possono corrispondere a un indirizzo IP rispetto a una lista di intervalli CIDR o risorse della lista di indirizzi di rete WAF:
-
address_in (abbina un indirizzo IP a un elenco di intervalli CIDR);
-
address_in_network_address_list (corrisponde a un indirizzo IP rispetto a una risorsa della lista di indirizzi di rete WAF);
-
vcn_address_in_network_address_list (abbina un indirizzo IP con un ID VCN a una risorsa della lista di indirizzi di rete WAF).
address_in
boolean address_in(string $ip_address, array[string] $cidr_subnets)
Restituisce true se $ip_address specificato è contenuto in almeno una delle subnet CIDR specificate in $cidr_subnets. In caso contrario restituisce false.
$ip_address deve essere una stringa contenente un indirizzo IP.
$cidr_subnets deve essere un array di stringhe contenenti ciascuna subnet CIDR.
Fornito | Espressione | Risultati |
---|---|---|
{ "connection": { "source": { "address": "1.1.1.1" } } } |
address_in(connection.source.address, ['1.1.0.0/16', '2.2.0.0/16']) | true |
address_in(connection.source.address, ['3.3.0.0/16']) | false |
address_in_network_address_list
boolean address_in_network_address_list(string $ip_address, array[string] $nal_ids)
Restituisce true se $ip_address specificato è contenuto in almeno una delle liste di indirizzi di rete fornite (risorsa WAF contenente una lista di subnet CIDR). In caso contrario restituisce false.$ip_address deve essere una stringa contenente un indirizzo IP.
Gli argomenti $nal_id devono essere un array di stringhe che fanno riferimento alle risorse NetworkAddressList WAF per ID. Tutti i riferimenti a NetworkAddressLists devono essere di tipo: "ADDRESSES".
Esempio 1
Elemento | Dettagli |
---|---|
Input specificato |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
NAL forniti |
ocid1.webappfirewallnetworkaddresslist...a:
|
Espressione | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
Risultati | true |
Elemento | Dettagli |
---|---|
Input specificato |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
NAL forniti |
ocid1.webappfirewallnetworkaddresslist...a:
ocid1.webappfirewallnetworkaddresslist...b:
|
Espressione | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...b']) |
Risultato | false |
vcn_address_in_network_address_list
boolean vcn_address_in_network_address_list(string $ip_address, string $vcn_id, array[string] $nal_ids)
Restituisce true se $ip_address specificato nella VCN $vcn_id è contenuto in almeno una delle liste di indirizzi di rete fornite (risorsa WAF contenente una lista di subnet CIDR). In caso contrario restituisce false.$ip_address deve essere una stringa contenente un indirizzo IP.
$vcn_id deve essere una stringa contenente un OCID di una VCN.
$nal_ids deve essere un array di stringhe che fanno riferimento alle risorse NetworkAddressList WAF per ID. Tutti i NetworkAddressLists di riferimento devono essere di tipo: "VCN_ADDRESSES".
Esempio 1Elemento | Dettagli |
---|---|
Input specificato |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
NAL forniti |
ocid1.webappfirewallnetworkaddresslist...a:
|
Espressione |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
Risultato |
true |
Elemento | Dettagli |
---|---|
Input specificato |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
NAL forniti |
ocid1.webappfirewallnetworkaddresslist...b:
|
Espressione | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
Risultato | false |