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
Tutti gli altri valori vengono convertiti in "vero". True indica che l'azione di una regola viene eseguita e false indica che l'azione non viene eseguita.

È 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')
Condizioni del metodo di richiesta HTTP
# 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&param2=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

connection.source.address

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"

connection.source.port

Categoria

Valore

Digitare

numerica

descrizione;

Porta di origine TCP

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

49152

connection.source.geo.countryCode

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"

connection.source.routing.asn

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

connection.destination.address

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"

connection.destination.port

Categoria

Valore

Digitare

numerica

descrizione;

Porta di destinazione TCP

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

80

connection.protocol

Categoria

Valore

Digitare

stringa

descrizione;

Il protocollo della connessione, sia "http" che "https".

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

"https"

http.request.host

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"

http.request.method

Categoria

Valore

Digitare

stringa

descrizione;

Metodo di richiesta HTTP

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

"GET", "POST"

http.request.version

Categoria

Valore

Digitare

stringa

descrizione;

Versione protocollo HTTP

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

"1.1", "2.0"

http.request.url.path

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", "/"

http.request.url.query

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", ""

http.request.url.queryParameters

Categoria

Valore

Digitare

oggetto

descrizione;

Parte della query della destinazione della richiesta HTTP, analizzata in una struttura di oggetti, dove:

  • Chiave: il nome di un parametro di query.

  • Valore: lista di valori con il nome "chiave".

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

Parte della query della destinazione della richiesta HTTP

Struttura oggetto analizzata

?param1=a&param2=b&param3=c

{
  "param1": ["a"],
  "param2": ["b"],
  "param3": ["c"]
}

?multi=one&multi=two&multi=3&encoded+key=two%20words

{
  "multi": ["one","two", "3"],
  "encoded key": ["two words"]
}
http.request.url.queryParameters

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

"?", ""

http.request.headers

Categoria

Valore

Digitare

oggetto

descrizione;

Intestazioni di richiesta HTTP analizzate in una struttura di oggetti, dove:

  • Chiave: nome dell'intestazione convertito in minuscolo.

  • Valore: elenco di valori di intestazione con il nome "chiave".

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

Header richiesta HTTP non elaborati (raw)

Struttura oggetto analizzata

Accept: application/json, text/csv
Accept: */*
Accept-Encoding: gzip
Accept-Encoding: deflate
Connection: keep-alive
Content-Language: en, fr
Content-Type: application/json
Host: www.example.com
User-Agent: HTTPie/2.2.0
{
  "accept":           ["application/json, text/csv", "*/*"],
  "accept-encoding":  ["gzip", "deflate"],
  "connection":       ["keep-alive"],
  "content-language": ["en, fr"],
  "content-type":     ["application/json"],
  "host":             ["www.example.com"],
  "user-agent":       ["HTTPie/2.2.0"]
}
}
http.request.cookies

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:

  • Chiave: nome del cookie.

  • Valore: elenco di valori dei cookie con il nome "chiave".

Disponibile in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valori di esempio

Valore dell'intestazione della richiesta HTTP "Cookie"

Struttura oggetto analizzata

cookie1=A; cookie2=B; cookie3=3C; cookie3=3D
{
  "cookie1": ["A"],
  "cookie2": ["B"],
  "cookie3": ["3C", "3D"]
}
http.response.code

Categoria

Valore

Digitare

numerica

descrizione;

Codice risposta HTTP

Disponibile in

responseAccessControl, responseProtection

Valori di esempio

200

http.response.headers

Categoria

Valore

Digitare

oggetto

descrizione;

Le intestazioni di risposta HTTP analizzate in una struttura di oggetti, dove:

  • Chiave: nome dell'intestazione convertito in minuscolo.

  • Valore: elenco di valori di intestazione con il nome "chiave".

Disponibile in

responseAccessControl, responseProtection

Valori di esempio

Header risposta HTTP non elaborati (raw)

Struttura oggetto analizzata

Cache-Control: no-cache
Cache-Control: must-revalidate
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=UTF-8
{
  "cache-control":    ["no-cache", "must-revalidate"],
  "connection":       ["keep-alive"],
  "content-encoding": ["gzip"],
  "content-type":     ["text/html;charset=UTF-8"]
}

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:

  • 1.1.0.0/16
  • 2.2.0.0/16
Espressione address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a'])
Risultati true
Esempio 2

Elemento Dettagli
Input specificato
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
NAL forniti

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16

ocid1.webappfirewallnetworkaddresslist...b:

  • 3.3.0.0/16
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 1

Elemento Dettagli
Input specificato
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
NAL forniti

ocid1.webappfirewallnetworkaddresslist...a:

  • 10.0.0.0/16 in ocid1.vcn...a
  • 10.1.0.0/16 in ocid1.vcn...b
Espressione
vcn_address_in_network_address_list(
  connection.source.address,
  connection.paResource.vcnOcid,
  ['ocid1.webappfirewallnetworkaddresslist...a']
)
Risultato

true

Esempio 2

Elemento Dettagli
Input specificato
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
NAL forniti

ocid1.webappfirewallnetworkaddresslist...b:

  • 10.0.0.0/16 in ocid1.vcn...c
Espressione vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] )
Risultato false