Passa al contenuto principale

4. Definizione del campo di intestazione (Header Field Definition)

Il campo di intestazione di risposta (Response Header Field) Content-Disposition è utilizzato per trasmettere informazioni aggiuntive su come elaborare il payload di risposta (Response Payload), e può anche essere utilizzato per allegare metadati (Metadata) aggiuntivi, come il nome file (Filename) da utilizzare quando si salva localmente il payload di risposta.

4.1. Grammatica (Grammar)

content-disposition = "Content-Disposition" ":"
disposition-type *( ";" disposition-parm )

disposition-type = "inline" | "attachment" | disp-ext-type
; case-insensitive (non sensibile al maiuscolo/minuscolo)
disp-ext-type = token

disposition-parm = filename-parm | disp-ext-parm

filename-parm = "filename" "=" value
| "filename*" "=" ext-value

disp-ext-parm = token "=" value
| ext-token "=" ext-value
ext-token = <i caratteri in token, seguiti da "*">

Definito in [RFC2616]:

token         = <token, definito in [RFC2616], Sezione 2.2>
quoted-string = <quoted-string, definito in [RFC2616], Sezione 2.2>
value = <value, definito in [RFC2616], Sezione 3.6>
; token | quoted-string

Definito in [RFC5987]:

ext-value   = <ext-value, definito in [RFC5987], Sezione 3.2>

I valori del campo di intestazione Content-Disposition con più istanze dello stesso nome di parametro (Parameter Name) non sono validi.

Si noti che a causa delle regole per lo spazio bianco lineare implicito (Sezione 2.1 di [RFC2616]), spazio bianco opzionale (OPTIONAL Whitespace) può apparire tra parole (token o quoted-string) e caratteri separatori.

Inoltre, si noti che il formato utilizzato per ext-value consente di specificare una lingua naturale (Natural Language) (ad esempio, "en"); questo è di utilità limitata per i nomi file e probabilmente verrà ignorato dai destinatari.

4.2. Tipo di disposizione (Disposition Type)

Se il tipo di disposizione (Disposition Type) corrisponde ad "attachment" (case-insensitive), questo indica che il destinatario dovrebbe richiedere all'utente di salvare la risposta localmente, piuttosto che elaborarla normalmente (secondo il suo tipo di media (Media Type)).

D'altra parte, se corrisponde a "inline" (case-insensitive), questo implica l'elaborazione predefinita. Pertanto, il tipo di disposizione "inline" è utile solo quando è aumentato con parametri aggiuntivi, come il nome file (Filename) (vedi sotto).

I tipi di disposizione sconosciuti o non gestiti dovrebbero essere trattati dai destinatari allo stesso modo di "attachment" (SHOULD) (vedi anche [RFC2183], Sezione 2.8).

4.3. Parametro di disposizione: Nome file (Disposition Parameter: 'Filename')

I parametri (Parameter) "filename" e "filename*" (corrispondenza case-insensitive) forniscono informazioni su come costruire un nome file per memorizzare il payload del messaggio (Message Payload).

A seconda del tipo di disposizione, queste informazioni possono essere utilizzate immediatamente (nell'interazione "salva con nome..." causata dal tipo di disposizione "attachment"), o successivamente (ad esempio, quando l'utente decide di salvare i contenuti della pagina attualmente visualizzata).

I parametri "filename" e "filename*" differiscono solo per il fatto che "filename*" utilizza la codifica (Encoding) definita in [RFC5987], consentendo l'uso di caratteri non presenti nel set di caratteri (Character Set) ISO-8859-1 ([ISO-8859-1]).

Molte implementazioni di agenti utente (User Agent) precedenti a questa specifica non comprendono il parametro "filename*". Pertanto, quando sia "filename" che "filename*" sono presenti in un singolo valore di campo di intestazione, i destinatari dovrebbero scegliere "filename*" e ignorare "filename" (SHOULD). In questo modo, i mittenti possono evitare trattamenti speciali per specifici agenti utente inviando sia il parametro "filename*" più espressivo, sia il parametro "filename" come fallback (Fallback) per i destinatari legacy (vedi Sezione 5 per un esempio).

È essenziale che i destinatari trattino il nome file specificato solo come consiglio, e quindi siano molto attenti nell'estrarre le informazioni desiderate. In particolare:

  • I destinatari non devono essere in grado di scrivere in alcuna posizione diversa da quella a cui sono specificamente autorizzati (MUST NOT). Per illustrare il problema, si considerino le conseguenze di poter sovrascrivere posizioni di sistema ben note (come "/etc/passwd"). Una strategia per raggiungere questo obiettivo è non fidarsi mai delle informazioni sul nome della cartella nel parametro filename, ad esempio rimuovendo tutto tranne l'ultimo segmento di percorso (Path Segment) e considerando solo il nome file effettivo (dove i 'segmenti di percorso' sono i componenti del valore del campo delimitati dai caratteri separatori di percorso (Path Separator Character) "\" e "/").

  • Molte piattaforme non utilizzano i tipi di media Internet (Internet Media Type) ([RFC2046]) per conservare le informazioni sul tipo nel file system (File System), ma si basano invece sulle estensioni dei nomi file (Filename Extension). Fidarsi dell'estensione del file fornita dal server potrebbe introdurre un'escalation di privilegi (Privilege Escalation) quando il file salvato viene successivamente aperto (si consideri ".exe"). Pertanto, i destinatari che utilizzano le estensioni dei file per determinare il tipo di media devono garantire che un'estensione di file utilizzata sia sicura, corrispondendo in modo ottimale al tipo di media del payload ricevuto (MUST).

  • I destinatari dovrebbero rimuovere o sostituire sequenze di caratteri (Character Sequence) note per causare confusione sia nelle interfacce utente (User Interface) che nei nomi file, come i caratteri di controllo (Control Character) e gli spazi iniziali e finali (SHOULD).

  • Altri aspetti di cui i destinatari devono essere consapevoli sono i nomi che hanno un significato speciale nel file system o nei comandi shell (Shell Command), come "." e "..", "~", "|", e anche i nomi dei dispositivi (Device Name). I destinatari dovrebbero ignorare o sostituire tali nomi (SHOULD).

Nota: Molti agenti utente non gestiscono correttamente il carattere di escape (Escape Character) "\" quando utilizzano la forma quoted-string. Inoltre, alcuni agenti utente tentano erroneamente di eseguire il de-escape dei caratteri di escape "percent" (Percent Escape) (vedi Appendice C.2), e quindi potrebbero interpretare erroneamente i nomi file contenenti il carattere percentuale seguito da due cifre esadecimali.

4.4. Parametro di disposizione: Estensioni (Disposition Parameter: Extensions)

Per consentire future estensioni, i destinatari dovrebbero ignorare i parametri non riconosciuti (SHOULD) (vedi anche [RFC2183], Sezione 2.8).

4.5. Estensibilità (Extensibility)

Si noti che la Sezione 9 di [RFC2183] definisce registri IANA (IANA Registry) sia per i valori di disposizione (Disposition Value) che per i parametri di disposizione (Disposition Parameter). Questo registro è condiviso da diversi protocolli (Protocol) che utilizzano Content-Disposition, come MIME e HTTP. Pertanto, non tutti i valori registrati hanno senso nel contesto di HTTP.