2015-02-13 18 views
5

Sto utilizzando i cookie per visualizzare alcuni dati in una pagina di ricerca, ma i miei cookie stanno confondendo i valori quando si utilizzano caratteri Unicode. Ad esempio, quando immagazzino il numero Inglês, ricevo Inglês quando lo rileggo.Come archiviare in modo sicuro i caratteri Unicode nei cookie?

Questo è quanto ho salvare il mio biscotto:

public void SalvaValue(string sessionKey, string sessionValue) 
{ 
    Response.Cookies.Add(new HttpCookie(sessionKey)); 

    var httpCookie = Response.Cookies[sessionKey]; 

    if (httpCookie != null) httpCookie.Value = sessionValue; 
    if (httpCookie != null) httpCookie.Expires = DateTime.Now.AddDays(14); 
} 

Ecco come posso recuperare è:

if (Request.Cookies["BuscaTipo"] != null) 
{ 
    tipoBusca = Request.Cookies["BuscaTipo"].Value.ToString(); 

    var cookie = new HttpCookie("BuscaTipo") { Expires = DateTime.Now.AddDays(-1) }; 
    Response.Cookies.Add(cookie); 
} 

Quando il debug del sito, mostra il giusto valore nel codice durante l'impostazione di esso, ma dopo che eseguo una richiesta con jQuery, il valore si presenta con i caratteri sbagliati.

Come posso archiviare in modo sicuro i caratteri Unicode nei cookie?

risposta

7

Vedere How to store other languages (unicode) in cookies and get it back again, Unicode Cookie Value, How to send non-English unicode string using HTTP header? e Allowed characters in cookies per una spiegazione del motivo per cui è necessario codificare i valori dei cookie.

In breve: i caratteri Unicode nelle intestazioni (in cui vengono inviati i cookie) sono supportati dalla maggior parte dei browser, ma non tutti. Alcuni browser interpretano i byte Unicode come ASCII, risultando in Mojibake.

jQuery sembra anche svolgere un ruolo in base ad alcune delle domande collegate, ma non riesco a riprodurlo.

Pertanto, per memorizzare in modo sicuro i caratteri Unicode (o meglio qualsiasi carattere non ASCII o di controllo) su tutti i browser, è necessario codificare i caratteri. Questo può essere implementato tramite, ad esempio, base64 e codifica percentuale.

Un'implementazione di quest'ultimo, leggermente adattata da Cookies and Unicode characters:

public static class CookieExtensions 
{ 
    public static string DecodedValue(this HttpCookie cookie) 
    { 
     if (cookie == null) 
     { 
      throw new ArgumentNullException("cookie"); 
     } 
     return HttpUtility.UrlDecode(cookie.Value); 
    } 

    public static void SetEncodedValue(this HttpCookie cookie, string value) 
    { 
     if (cookie == null) 
     { 
      throw new ArgumentNullException("cookie"); 
     } 
     cookie.Value = HttpUtility.UrlEncode(value); 
    } 

    public static string DecodedValues(this HttpCookie cookie, string name) 
    { 
     if (cookie == null) 
     { 
      throw new ArgumentNullException("cookie"); 
     } 
     return HttpUtility.UrlDecode(cookie.Values[name]); 
    } 

    public static void SetEncodedValues(this HttpCookie cookie, string name, string value) 
    { 
     if (cookie == null) 
     { 
      throw new ArgumentNullException("cookie"); 
     } 
     cookie.Values[name] = HttpUtility.UrlEncode(value); 
    } 

    public static string DecodedValues(this HttpCookie cookie, int index) 
    { 
     if (cookie == null) 
     { 
      throw new ArgumentNullException("cookie"); 
     } 
     return HttpUtility.UrlDecode(cookie.Values[index]); 
    } 
} 

utilizzati:

if (Request.Cookies["TestCookieValue"] != null) 
{ 
    ViewBag.CookieValue = Request.Cookies["TestCookieValue"].DecodedValue(); 
} 

if (Request.Cookies["TestCookieValues"] != null) 
{ 
    ViewBag.CookieValues = Request.Cookies["TestCookieValues"].DecodedValues("foo"); 
    ViewBag.CookieValuesIndexed = Request.Cookies["TestCookieValues"].DecodedValues(0); 
} 

var cookieWithValue = new HttpCookie("TestCookieValue"); 
cookieWithValue.Expires = DateTime.Now.AddHours(1); 
cookieWithValue.SetEncodedValue("Inglês"); 
Response.SetCookie(cookieWithValue); 

var cookieWithValues = new HttpCookie("TestCookieValues"); 
cookieWithValues.Expires = DateTime.Now.AddHours(1); 
cookieWithValues.SetEncodedValues("foo", "Inglês"); 
Response.SetCookie(cookieWithValues); 

Notare HttpUtility.UrlDecode() è pericoloso, utilizzare AntiXSS evitare scripting cross-site e iniezione SQL dal valori del cookie, che possono essere impostati arbitrariamente dal cliente.

È anche possibile riconsiderare la memorizzazione dei valori Unicode nei cookie. È possibile identificare facilmente la lingua in caso contrario, ad esempio tramite il codice en-US o l'indice del database, se applicabile.

Problemi correlati