2015-02-13 9 views
5

Ich verwende Cookies, um einige Daten auf einer Suchseite anzuzeigen, aber meine Cookies verstopfen die Werte, wenn Unicode-Zeichen verwendet werden. Zum Beispiel, wenn ich Inglês speichern, bekomme ich Inglês, wenn ich es zurück lese. DieseWie können Unicode-Zeichen in Cookies sicher gespeichert werden?

ist, wie ich meine Cookie speichern:

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); 
} 

Dies ist, wie ich abrufen es:

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); 
} 

Wenn ich die Website debuggen, es zeigt den richtigen Wert in Code, wenn es Einstellung, Aber nachdem ich eine Anfrage mit jQuery gemacht habe, kommt der Wert mit den falschen Zeichen.

Wie kann ich Unicode-Zeichen in Cookies sicher speichern?

Antwort

7

Siehe 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? und Allowed characters in cookies für eine Erklärung, warum Sie Cookie-Werte codieren müssen.

Kurz gesagt: Unicode-Zeichen in Headern (in denen Cookies gesendet werden) werden von den meisten Browsern unterstützt, aber nicht alle. Einige Browser interpretieren die Unicode-Bytes als ASCII, was zu Mojibake führt.

jQuery scheint auch eine Rolle zu spielen, was einige der verknüpften Fragen betrifft, aber das kann ich nicht reproduzieren.

Um Unicode-Zeichen (oder besser alle Nicht-ASCII- oder Steuerzeichen) in allen Browsern sicher zu speichern, müssen Sie die Zeichen daher codieren. Dies kann zum Beispiel durch base64- und Prozent-Codierung implementiert werden.

Eine Implementierung der letzteren angepasst leicht von 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]); 
    } 
} 

Verbrauch:

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); 

Bitte beachten Sie HttpUtility.UrlDecode() gefährlich ist, verwenden Sie AntiXSS Cross-Site-Scripting und SQL-Injection von der zu verhindern Cookie-Werte, die vom Client beliebig gesetzt werden können.

Sie können vielleicht auch die Speicherung von Unicode-Werten in Cookies überdenken. Sie können die Sprache auf einfache Weise identifizieren, z. B. über den Code en-US oder dessen Datenbankindex, falls zutreffend.

Verwandte Themen