在ASP.NET Core中添加的Cookie如果含有特殊字符,會被自動轉義


我們知道在Cookie中有些字符是特殊字符,這些字符是不能出現在Cookie的鍵值中的。

比如"="是Cookie中用來分隔鍵和值的特殊字符,例如:Key01=Value01,表示的是一個Cookie鍵值對,用"="分隔鍵和值。

比如";"是Cookie中用來分隔多個Cookie鍵值的特殊字符,例如:Key01=Value01;Key02=Value02,表示的是兩個Cookie鍵值對,用";"分隔兩個Cookie鍵值。

 

那么如果我們在ASP.NET Core中,將這些特殊字符寫入Cookie的鍵值中,會不會發生錯誤呢?

為此我們來做一個實驗,首先我們創建一個ASP.NET Core MVC 3.0項目:AspNetCoreCookieTest

在這個項目的HomeController中,我們創建了四個Action方法:

  • Index,用於對cookie進行添加、刪除、顯示
  • AddCookie,添加cookie
  • RemoveCookie,刪除添加的cookie
  • ShowCookieInAspNetCore,從ASP.NET Core代碼中獲取添加的cookie,並在視圖頁面中顯示獲取到的cookie值

HomeController的代碼如下所示:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace AspNetCoreCookieTest.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// Index視圖,用於對cookie進行添加、刪除、顯示
        /// </summary>
        public IActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 添加cookie
        /// </summary>
        public IActionResult AddCookie()
        {
            //添加兩個cookie:"Key01=&;鍵01"和"Key02=&;鍵02",這兩個cookie的key和value中都包含cookie特殊字符(諸如=&;等)
            Response.Cookies.Append("Key01=&;鍵01", "ABC=DEFG&H值01IJK;MLN");
            Response.Cookies.Append("Key02=&;鍵02", "ABC\"EF值02G+123");

            return View("Index");
        }

        /// <summary>
        /// 刪除添加的cookie
        /// </summary>
        public IActionResult RemoveCookie()
        {
            Response.Cookies.Delete("Key01=&;鍵01");
            Response.Cookies.Delete("Key02=&;鍵02");

            return View("Index");
        }

        /// <summary>
        /// 從ASP.NET Core代碼中獲取添加的cookie,並在視圖頁面中顯示獲取到的cookie值
        /// </summary>
        public IActionResult ShowCookieInAspNetCore()
        {
            string Key01 = Request.Cookies["Key01=&;鍵01"];
            string Key02 = Request.Cookies["Key02=&;鍵02"];

            if (Key01 == null)
            {
                Key01 = string.Empty;
            }

            if (Key02 == null)
            {
                Key02 = string.Empty;
            }

            this.ViewData["Key01"] = string.Format("Cookie Key01=&;鍵01 value is {0}", Key01);
            this.ViewData["Key02"] = string.Format("Cookie Key02=&;鍵02 value is {0}", Key02);

            return View();
        }
    }
}

可以看到,我們在AddCookie方法中,添加了兩個Cookie鍵值對,並且我們在Cookie的鍵和值中都加入了特殊字符,諸如"="、"&"、";"等。然后我們稍后會用ShowCookieInAspNetCore方法在ASP.NET Core代碼中獲取添加的這兩個Cookie鍵值對,並在視圖頁面上進行顯示。

 

接下來我們來看看Index.cshtml視圖頁面的代碼:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script type="text/javascript" src="~/lib/jquery/dist/jquery.js" ></script>
    <script type="text/javascript">

        $(function () {
            //添加cookie
            $("#btnAddCookie").click(function () {
                window.location = "@Url.Action("AddCookie")";
            });

            //在web瀏覽器中,采用JavaScript顯示添加的cookie
            $("#btnShowCookie").click(function () {
                alert(document.cookie);
            });

            //刪除添加的cookie
            $("#btnRemoveCookie").click(function () {
                window.location = "@Url.Action("RemoveCookie")";
            });

            //從ASP.NET Core代碼中獲取添加的cookie,並在視圖頁面中顯示獲取到的cookie值
            $("#btnShowAspNetCoreCookie").click(function () {
                window.location = "@Url.Action("ShowCookieInAspNetCore")";
            });
        });

    </script>
</head>
<body>
    <div>
        <button id="btnAddCookie">添加Cookie</button>
    </div>
    <div style="margin-top:10px;">
        <button id="btnShowCookie">用JavaScript顯示Cookie</button>
    </div>
    <div style="margin-top:10px;">
        <button id="btnRemoveCookie">刪除Cookie</button>
    </div>
    <div style="margin-top:10px;">
        <button id="btnShowAspNetCoreCookie">在ASP.NET Core中顯示Cookie</button>
    </div>
</body>
</html>

我們在這個視圖中,定義了四個按鈕:

  • btnAddCookie,添加Cookie
  • btnShowCookie,用JavaScript顯示Cookie
  • btnRemoveCookie,刪除Cookie
  • btnShowAspNetCoreCookie,在ASP.NET Core中顯示Cookie

 

現在我們就來進行測試,執行項目,然后在web瀏覽器中訪問HomeController的Index方法,在顯示的視圖頁面中我們先點擊添加Cookie按鈕:

這時ASP.NET Core執行了HomeController的AddCookie方法,所以我們已經添加了兩個Cookie鍵值對。

 

接下來我們在頁面上點擊用JavaScript顯示Cookie按鈕,這時我們可以看到盡管我們添加的Cookie中鍵和值都包含特殊字符,但是實際上ASP.NET Core將Cookie鍵和值中的特殊字符都轉義了,進行了Url編碼,所以我們在web瀏覽器中使用JavaScript顯示Cookie鍵值時,得到的是進行Url編碼后的Cookie鍵值:

所以兩個Cookie鍵值對並沒有因為特殊字符而被錯誤地存儲到web瀏覽器中,鍵和值中所有的特殊字符都采用Url編碼進行了轉義。

 

接下來,我們在頁面上點擊在ASP.NET Core中顯示Cookie按鈕,看看再從ASP.NET Core代碼中將這兩個Cookie鍵值對讀出來會是什么結果:

這個按鈕會觸發HomeController的ShowCookieInAspNetCore方法,然后顯示ShowCookieInAspNetCore.cshtml視圖頁面,這個視圖頁面的代碼如下:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ShowCookieInAspNetCore</title>
</head>
<body>
    <div>
        @ViewData["Key01"].ToString()
    </div>
    <div style="margin-top:10px;">
        @ViewData["Key02"].ToString()
    </div>
    <div style="margin-top:10px;">
        <a href="@Url.Action("Index")">返回Index視圖頁面</a>
    </div>
</body>
</html>

這個視圖頁面其實就是將ASP.NET Core代碼獲取到的兩個Cookie的值顯示出來。

該視圖頁面執行結果如下:

同時我們在Visual Studio中添加斷點,在調試模式下,監測到了HomeController的ShowCookieInAspNetCore方法中獲取到的兩個Cookie值:

可以看到不管是ShowCookieInAspNetCore.cshtml視圖頁面,還是Visual Studio的調試模式,都顯示ASP.NET Core代碼獲取到的兩個Cookie鍵值對,都自動進行了Url解碼,和前面我們添加Cookie時的鍵和值完全相同。

所以這說明當我們在ASP.NET Core中存儲Cookie鍵值到web瀏覽器時,ASP.NET Core代碼會自動將Cookie鍵值中的特殊字符采用Url編碼進行轉義,而稍后我們用ASP.NET Core代碼讀取Http請求中的Cookie鍵值時,ASP.NET Core代碼又會自動將Cookie鍵值中的特殊字符采用Url解碼進行還原。

所以在ASP.NET Core中將特殊字符存入Cookie鍵值對是沒有問題的,只不過如果在客戶端web瀏覽器中使用JavaScript獲取Cookie時,獲取到的將會是Url編碼后的Cookie鍵和值。但是從ASP.NET Core代碼的角度去讀寫Cookie鍵和值是完全沒有問題的,因為ASP.NET Core代碼會對Cookie鍵和值中的特殊字符自動進行Url編碼和Url解碼。

 

下載本文ASP.NET Core MVC 3.0項目的源代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM