Passa al contenuto principale

B.4. Trasformazioni dei messaggi HTTP (HTTP Message Transformations)

B.4. Trasformazioni dei messaggi HTTP (HTTP Message Transformations)

HTTP consente a intermediari e applicazioni di trasformare un messaggio HTTP senza alterarne la semantica. Le firme dei messaggi HTTP sono progettate per essere robuste rispetto a molte di queste trasformazioni in circostanze diverse.

Ad esempio, il seguente messaggio di richiesta HTTP è stato firmato usando l'algoritmo Ed25519 e la chiave test-key-ed25519:

NOTA: a capo con '' secondo RFC 8792

GET /demo?name1=Value1&Name2=value2 HTTP/1.1 Host: example.org Date: Fri, 15 Jul 2022 14:24:55 GMT Accept: application/json Accept: / Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519" Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:

La stringa della base della firma per questo messaggio è:

"@method": GET "@path": /demo "@authority": example.org "accept": application/json, / "@signature-params": ("@method" "@path" "@authority" "accept")
;created=1618884473;keyid="test-key-ed25519"

Il messaggio seguente è stato modificato aggiungendo il campo di intestazione Accept-Language e un parametro di query. Tuttavia, poiché né Accept-Language né la query sono coperti dalla firma, la stessa firma resta valida:

NOTA: a capo con '' secondo RFC 8792

GET /demo?name1=Value1&Name2=value2&param=added HTTP/1.1 Host: example.org Date: Fri, 15 Jul 2022 14:24:55 GMT Accept: application/json Accept: / Accept-Language: en-US,en;q=0.5 Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519" Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:

Il messaggio seguente è stato modificato rimuovendo il campo Date, aggiungendo un campo Referer e unendo i valori del campo Accept in una sola riga. I campi Date e Referer non sono coperti dalla firma, e l'unione del campo Accept è una trasformazione consentita già contemplata dall'algoritmo di canonicalizzazione dei valori dei campi HTTP. La stessa firma resta valida:

NOTA: a capo con '' secondo RFC 8792

GET /demo?name1=Value1&Name2=value2 HTTP/1.1 Host: example.org Referer: https://developer.example.org/demo Accept: application/json, / Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519" Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:

Il messaggio seguente è stato modificato riordinando i valori dei campi del messaggio originale ma senza riordinare le singole occorrenze del campo Accept. La stessa firma resta valida:

NOTA: a capo con '' secondo RFC 8792

GET /demo?name1=Value1&Name2=value2 HTTP/1.1 Accept: application/json Accept: / Date: Fri, 15 Jul 2022 14:24:55 GMT Host: example.org Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519" Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:

Il messaggio seguente è stato modificato cambiando il metodo in POST e l'autorità in "example.com" (nel campo Host). Poiché sia il metodo sia l'autorità sono coperti dalla firma, la stessa firma NON è più valida:

NOTA: a capo con '' secondo RFC 8792

POST /demo?name1=Value1&Name2=value2 HTTP/1.1 Host: example.com Date: Fri, 15 Jul 2022 14:24:55 GMT Accept: application/json Accept: / Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519" Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:

Il messaggio seguente è stato modificato cambiando l'ordine delle due occorrenze del campo Accept. Poiché in HTTP l'ordine dei campi con lo stesso nome ha significato semantico, ciò modifica il valore usato nella base della firma e la stessa firma NON è più valida:

NOTA: a capo con '' secondo RFC 8792

GET /demo?name1=Value1&Name2=value2 HTTP/1.1 Host: example.org Date: Fri, 15 Jul 2022 14:24:55 GMT Accept: / Accept: application/json Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519" Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==: