CSharp - 在 Cookies 中,如何安全地存储Unicode字符?

  显示原文与译文双语对照的内容
0 0

我使用 Cookies 在搜索页面中显示某些数据,但是在使用Unicode字符时,Cookies 是garbling值。 例如当我存储 Inglês 时,当我读到时,它就得到了 Inglês

这就是我保存cookie的方式:


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

这就是我检索它的方法:


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

当调试站点时,它在代码中显示正确的值,但在我执行jQuery请求后,值出现错误。

如何在 Cookies 中安全地存储Unicode字符?

时间: 原作者:

0 0

请参见如何在 Cookies 中存储其他语言( Unicode ),并再次返回Unicode Cookie值,如何使用HTTP头发送非英语Unicode字符串? 和允许在 Cookies 中使用字符,以解释为什么需要编码cookie值。

简而言之,大多数浏览器都支持标题( 其中 Cookies 被发送) 中的Unicode字符,但并非所有浏览器都支持。 有些浏览器将Unicode字节解释为 ASCII,结果是 Mojibake 。

jQuery似乎根据一些链接的问题演奏了一个角色,但是我无法重复这个问题。

因此,要在所有浏览器中安全地存储Unicode字符( 或者任何非ascii或者控制字符),需要对字符进行编码。 例如可以通过base64和百分比编码实现这一点。

后者的实现,从 Cookies 和Unicode字符稍微调整:


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

使用方法:


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

请注意,HttpUtility.UrlDecode() 危险,使用 AntiXSS防止跨站点脚本和 SQL注入的cookie值,这可以由客户端任意设置。

你也许还可以考虑在 Cookies 中存储Unicode值。 如果可以,可以很容易地识别语言,例如通过代码 en-US 或者它的数据库索引。

原作者:
...