在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项目的源代码
在ASP.NET Core中添加的Cookie如果含有特殊字符,会被自动转义的更多相关文章
- 在Asp.Net Core中添加区域的简单实现
使用区域,可以有效的对业务进行隔离,各种业务及分工可以更灵活.在Asp.Net Core中启用区域也是极简单的. 使用步骤: 1.在 Startup.cs 中添加区域的路由: app.UseMvc(r ...
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- asp.net core MVC 添加静态文件
ASP.net Core 中添加插件需要 1.将文件放在wwwroot文件夹下(根目录文件夹,没有的话需要创建) 2.需要在project.json中的dependencies添加如下依赖 " ...
- 在ASP.NET Core 中使用Cookie中间件
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- 在ASP.NET Core 中使用Cookie中间件 (.net core 1.x适用)
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- ASP.NET CORE中使用Cookie身份认证
大家在使用ASP.NET的时候一定都用过FormsAuthentication做登录用户的身份认证,FormsAuthentication的核心就是Cookie,ASP.NET会将用户名存储在Cook ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...
随机推荐
- linux设备驱动程序-设备树(1)-dtb转换成device_node
linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...
- 004-OpenStack-计算服务
OpenStack-计算服务 [基于此文章的环境]点我快速打开文章 1.控制节点(controller) 1.1 创库授权 nova_api, nova, 和 nova_cell0 mysql CR ...
- 渗透技巧——Windows系统的帐户隐藏
渗透技巧——Windows系统的帐户隐藏 2017-11-28-00:08:55 0x01 帐户隐藏的方法 该方法在网上已有相关资料,本节只做简单复现 测试系统:·Win7 x86/WinXP 1. ...
- 上云测试,这些关键点你get 到没有
导读,先从云化说起,再谈谈云化形态下,除了常规的功能测试,云化的测试,还需要有几个必须要get到的硬核指标,最后在分别详解这些关键点硬核指标是什么,和如何测试呢.这是个值得深思的问题,希望所有测试人都 ...
- Arbitrage POJ - 2240
题目链接:https://vjudge.net/problem/POJ-2240 思路:判正环,Bellman-ford和SPFA,floyd都可以,有正环就可以套利. 这里用SPFA,就是个板子题吧 ...
- 3-剑指Offer: 连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 201871010132-张潇潇-《面向对象程序设计(java)》第十周总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- shell-基础2
条件表达式 文件判断 文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 -f文件,f的全拼为file 文件存在且为普通文件则为 ...
- 算法竞赛入门经典 LA 4329(树状数组)
题意: 一排有着不同能力值的人比赛,规定裁判的序号只能在两人之间,而且技能值也只能在两人之间 问题: <算法竞赛入门经典-训练指南>的分析: 上代码: #include<iostre ...
- QT控制文本框输入内容
利用正则表达式,例: //即账号最长为10位,只能由数字组成 QRegExp regx("[0-9]{1,10}"); QValidator *validator = new QR ...