Il percorso nell'URL Set-Cookie è codificato?

1

Sto scrivendo del codice che imposta i cookie e mi sto interrogando sulla semantica esatta dell'intestazione Set-Cookie . Immagina la seguente linea di intestazione HTTP:

Set-Cookie: name=value; Path=/%20

Per path con path questo imposta il cookie? / o /%20 (senza escape) ( /%20 o /%2520 fuggito)?

Il motivo per cui sto chiedendo è che dovrei supportare percorsi non ASCII. Poiché l'intestazione HTTP deve essere solo ASCII, il mio piano era quello di eseguire l'escape dell'URL del valore del percorso ma la specifica HTTP non è chiara come avrei sperato.

Modifica

So cosa deve fare Path. La mia domanda è: il valore è interpretato come percentuale codificata o no?

    
posta Philippe Marschall 30.03.2013 - 17:35
fonte

3 risposte

2

Lo standard per supportare gli IRI afferma che la codifica dei caratteri per tale URL deve essere UTF-8. Dichiara inoltre in 4.1.2.4 nel meccanismo di gestione dello stato HTTP che il percorso è quello della parte di directory dell'URI (cioè l'IRI codificato). Per esempio. la directory '/ å /' ha il percorso del cookie '/% C3% A5 /' anche se l'intestazione della risposta indica che il tipo di contenuto è ISO-8859-1.

% 20 è uno spazio codificato nel set di caratteri UTF-8, quindi il percorso del cookie '/% 20' è spazio-barra.

    
risposta data 03.04.2013 - 01:11
fonte
5

Sintassi

setcookie(name,value,expire,path,domain,secure)

path

Optional. Specifies the server path of the cookie If set to "/", the cookie will be available within the entire domain. If set to "/test/", the cookie will only be available within the test directory and all sub-directories of test. The default value is the current directory that the cookie is being set in.

Fonte: funzione PHP setcookie ()

Esiste anche una grande risposta SO esistente sui caratteri consentiti nei cookie (parla di caratteri ASCII)

What that document doesn't remember to say, because Netscape were terrible at writing specs, was that control characters (\x00 to \x1F plus \x7F) aren't allowed, and support for non-ASCII characters is left unspecified.

What browsers do:

  • in Opera and Google Chrome, non-ASCII characters are encoded into cookies with UTF-8;
  • in IE, the machine's default code page is used (locale-specific and never UTF-8);
  • Firefox (and other Mozilla-based browsers) use the low byte of each UTF-16 code point on its own (so ISO-8859-1 is OK but anything else is mangled);
  • Safari simply refuses to send any cookie containing non-ASCII characters.

So in practice you cannot use non-ASCII characters in cookies at all. If you want to use Unicode, control codes or other arbitrary byte sequences you must use an ad-hoc encoding scheme of your own choosing. Most popular is UTF-8-inside-URL-encoding (as produced by JavaScript's encodeURIComponent).

    
risposta data 02.04.2013 - 15:02
fonte
1

La mia intuizione dice che il percorso è un valore con codifica URL (poiché si tratta di un URL).

Perché non testarlo? Ho creato la seguente configurazione di nginx:

add_header Set-Cookie "k=v; path=/";
add_header Set-Cookie "f%2520o=ba%2520r; path=/qa%20x";
add_header Set-Cookie "f%2520o=ba%2520r; path=/qb%25x";
add_header Set-Cookie "Z%2520Z=Z%2520Z; path=/";
location ~ /q.* {
    try_files $uri /cookie.html;
}

La pagina dell'indice:

<iframe src="/qa%20x"></iframe>
<iframe src="/qa x"></iframe>
<iframe src="/qb%25x"></iframe>
<iframe src="/qb%2520x"></iframe>
<iframe src="/qb%20x"></iframe>

La pagina dei cookie sta essenzialmente scrivendo document.cookie . Conclusione: il percorso è interpretato come una sequenza codificata in percentuale (con conversione automatica di uno spazio in %20 secondo necessità). L'ho provato su Firefox e Chromium, entrambi i browser mostrano lo stesso comportamento. Indovina quale browser è un'eccezione di questo ... IE8 non ha mostrato i cookie dal percorso con codifica percentuale.

Ho fatto più test, e ho scoperto che IE ignorava i cookie con path /foo per una richiesta letterale a /foo . Una richiesta per /foo/ (con Set-Cookie: key=val; path=/foo ) funziona comunque. Anche con valori con codifica percentuale.

    
risposta data 03.04.2013 - 00:27
fonte

Leggi altre domande sui tag