【在Linux世界中追寻伟大的One Piece】HTTP cookie

目录

1 -> 引入HTTP cookie

1.1 -> 定义

1.2 -> 工作原理

1.3 -> 分类

1.4 -> 安全性

2 -> 认识cookie

2.1 -> 基本格式 

2.2 -> GMT vs UTC

3 -> cookie的生命周期

3.1 -> 安全性考虑

3.2 -> 安全测试cookie

3.2.1 -> 测试cookie写入浏览器 

3.2.2 -> 测试自动提交

3.2.3 -> 测试写入过期时间

3.2.4 -> 测试路径path

4 -> 单独使用Cookie会存在什么问题


1 -> 引入HTTP cookie

1.1 -> 定义

HTTP Cookie(也称为Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发送请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。

1.2 -> 工作原理

  • 当用户第一次访问网站时,服务器会在响应的HTTP头中设置Set-Cookie字段,用于发送Cookie到用户的浏览器。
  • 浏览器在接收到Cookie后,会将其保存在本地(通常是按照域名进行存储)。
  • 在之后的请求中,浏览器会自动在HTTP请求头中携带Cookie字段,将之前保存的Cookie信息发送给服务器。

1.3 -> 分类

  • 会话Cookie(Session Cookie):在浏览器关闭时失效。
  • 持久Cookie(Persistent Cookie):带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
  • 如果cookie是一个持久性的cookie,那么它其实就是浏览器相关的,特定目录下的一个文件。但直接查看这些文件可能会看到乱码或无法读取的内容,因为cookie文件通常以二进制或sqlite格式存储。一般我们查看,直接在浏览器对应的选项中直接查看即可。

类似下面这种方式:

1.4 -> 安全性

由于Cookie是存储在客户端的,因此存在被篡改或窃取的风险。 

用途

  • 用户认证和会话管理(最重要)
  • 跟踪用户行为
  • 缓存用户偏好等
  • 比如在chrome浏览器下,可以直接访问:chrome://settings/cookies

2 -> 认识cookie

  • HTTP存在一个报头选项:Set-Cookie,可以用来进行给浏览器设置Cookie值。
  • 在HTTP响应头中添加,客户端(如浏览器)获取并自行设置并保存Cookie。

2.1 -> 基本格式 

Set - Cookie: < name >= <value>
其中:
<name>是Cookie的名称,<value>是Cookie的值。

完整的Set - Cookie

Set - Cookie: username = zzl; expires = Thu, 5 Dec 2024 12:00:00
UTC; path = / ; domain = .example.com; secure; HttpOnly

时间格式必须遵守RFC 1123标准,具体格式样例:Tue, 01 Jan 2030 12:34:56 GMT或者UTC(推荐)。

关于时间解释

  • Tue:星期二(星期几的缩写)
  • ,:逗号分隔符
  • 01:日期(两位数表示)
  • Jan:一月(月份的缩写)
  • 2030:年份(四位数)
  • 12:34:56:时间(小时、分钟、秒)
  • GMT:格林威治标准时间(时区缩写)

2.2 -> GMT vs UTC

GMT(格林威治标准时间)和 UTC(协调世界时)是两个不同的时间标准,但它们在大多数情况下非常接近,常常被混淆。以下是两者的简单解释和区别:

1. GMT(格林威治标准时间):

  • GMT是格林威治标准时间的缩写,它是以英国伦敦的格林威治区为基准的世界时间标准。
  • GMT不受夏令时或其他因素的影响,通常用于航海、航空、科学、天文等领域。
  • GMT的计算方式是基于地球的自转和公转。

2. UTC(协调世界时):

  • UTC全称为“协调世界时”,是国际电信联盟(ITU)制定和维护的标准时间。
  • UTC的计算方式是基于原子钟,而不是地球的自转,因此它比GMT更准确。据称,世界上最精确的原子钟50亿年才会误差1秒。
  • UTC是现在用的时间标准,多数全球性的网络和软件系统将其作为标准时间。

GMT和UTC的英文全称以及相关信息如下:

1. GMT(格林威治标准时间)

  • 英文全称:Greenwich Mean Time
  • GMT是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义为通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。
  • 但值得注意的是,地球的自转是有些不规则的,且正在缓慢减速。因此,格林尼治时间已经不再被作为标准时间使用。

2. UTC(协调世界时)

英文全称:Coordinated Universal Time

  • UTC是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
  • UTC被广泛使用在计算机网络、航空航天等领域,因为它提供了非常准确和可靠的时间参考。

总结来说,GMT和UTC都曾是或现在是国际上重要的时间标准,但由于地球自转的不规则性和原子钟的精确性,UTC已经成为了全球性的标准时间,而GMT则更多被用作历史和地理上的参考。

区别:

  • 计算方式:GMT基于地球的自转和公转,而UTC基于原子钟。
  • 准确度:由于UTC基于原子钟,它比基于地球自转的GMT更加精确。

在实际使用中,GMT和UTC之间的差别通常很小,大多数情况下可以交换使用。但在需要高精度时间计量的场合,如科学研究、网络通信等,UTC是更为准确的选择。

关于其他可选属性的解释

  • expires=<data>[要验证]:设置Cookie的过期时期/时间。如果未指定此属性,则Cookie默认为会话Cookie,即当浏览器关闭时过期。
  • path=<some_path>[要验证]:限制Cookie发送到服务器的哪些路径。默认为设置它的路径。
  • domain=<domain_name>:指定哪些主机可以接受该Cookie。默认为设置它的主机。
  • secure:仅当使用HTTPS协议时才发送Cookie。这有助于防止Cookie在不安全的HTTP连接中被截获。
  • HttpOnly:标记Cookie为HttpOnly,意味着该Cookie不能被客户端脚本(如JavaScript)访问。这有助于防止跨站脚本攻击(XSS)。

以下是对Set-Cookie头部字段的简洁介绍

属性描述
usernamezzl这是Cookie的名称和值,标识用户名为“zzl”。
expiresThu,5 Dec 2024 12:00:00 UTC指定Cookie的过期时间。在这个例子中,Cookie将在2024年12月5日12:00:00 UTC后过期。
path/定义Cookie的作用范围。这里设置的根路径为/,意味着Cookie对.example.com域名下的所有路径都可以用。
domain.example.com指定哪些域名可以接收这个Cookie。点前缀(.)表示包括所有的子域名。
secure-指示Cookie只能通过HTTPS协议发送,不能通过HTTP协议发送,增加安全性。
HttpOnly-阻止客户端脚本(如JavaScript)访问此Cookie,有助于防止跨站脚本攻击(XSS)。

注意:

  • 每个Cookie属性都以分号(;)和空格( )分割。
  • 名称和值之间使用等号(=)分隔。
  • 如果Cookie的名称或值包含特殊字符(如空格、分号、逗号等),则需要进行URL编码。

3 -> cookie的生命周期

  • 如果设置了expires属性,则Cookie将在指定的日期/时间后过期。
  • 如果没有设置expires属性,则Cookie默认为会话Cookie,即当浏览器关闭时过期。

3.1 -> 安全性考虑

安全性考虑

  • 使用secure标志可以确保Cookie仅在HTTPS连接上发送,从而提高安全性。
  • 使用HttpOnly标志可以防止客户端脚本(如JavaScript)访问Cookie,从而防止XSS攻击。
  • 通过合理设置Set-Cookie的格式和属性,可以确保Cookie的安全性、有效性和可访问性,从而满足Web应用程序的需求。

3.2 -> 安全测试cookie

Comm.hpp HttpProtocol.hpp InetAddr.hpp LockGuard.hpp Log.hpp
Main.cc Makefile Socket.hpp TcpServer.hpp Thread.hpp
ThreadPool.hpp

3.2.1 -> 测试cookie写入浏览器 

3.2.2 -> 测试自动提交

  • 刷新浏览器,刚刚写入的cookie会自动被提交给服务器端。

3.2.3 -> 测试写入过期时间

  •  这里要自己形成UTC统一标准时间,以下是C++代码。

std::string GetMonthName(int month)
{std::vector<std::string> months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };return months[month];
}std::string GetWeekDayName(int day)
{std::vector<std::string> weekdays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };return weekdays[day];
}std::string ExpireTimeUseRfc1123(int t) // 秒级别的未来 UTC 时间
{time_t timeout = time(nullptr) + t;// 这个地方有坑哦struct tm* tm = gmtime(&timeout); // 这里不能用 localtime,因为localtime是默认带了时区的.gmtime 获取的就是 UTC 统一时间char timebuffer[1024];//时间格式如: expires=Thu, 18 Dec 2024 12:00:00 UTCsnprintf(timebuffer, sizeof(timebuffer),"%s, %02d %s %d %02d:%02d:%02d UTC",GetWeekDayName(tm->tm_wday).c_str(),tm->tm_mday,GetMonthName(tm->tm_mon).c_str(),tm->tm_year + 1900,tm->tm_hour,tm->tm_min,tm->tm_sec);return timebuffer;
}

3.2.4 -> 测试路径path

提交到非/a/b路径下

  • 比如:http://8.137.19.140:8888/a/x
  • 比如:http://8.137.19.140:8888/
  • 比如:http://8.137.19.140:8888/x/y

提交到/a/b路径下

核心代码:

class Http
{
private:std::string GetMonthName(int month){std::vector<std::string> months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };return months[month];}std::string GetWeekDayName(int day){std::vector<std::string> weekdays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };return weekdays[day];}std::string ExpireTimeUseRfc1123(int t) // 秒级别的未来UTC时间{time_t timeout = time(nullptr) + t;struct tm* tm = gmtime(&timeout); // 这里不能用localtime,因为localtime是默认带了时区的.gmtime 获取的就是 UTC 统一时间char timebuffer[1024];//时间格式如: expires=Thu, 18 Dec 2024 12:00:00 UTCsnprintf(timebuffer, sizeof(timebuffer),"%s, %02d %s %d %02d:%02d:%02d UTC",GetWeekDayName(tm->tm_wday).c_str(),tm->tm_mday,GetMonthName(tm->tm_mon).c_str(),tm->tm_year + 1900,tm->tm_hour,tm->tm_min,tm->tm_sec);return timebuffer;}public:Http(uint16_t port){_tsvr = std::make_unique<TcpServer>(port,std::bind(&Http::HandlerHttp, this, std::placeholders::_1));_tsvr->Init();}std::string ProveCookieWrite() // 证明 cookie 能被写入浏览器{return "Set-Cookie: username=zhangsan;";}std::string ProveCookieTimeOut(){return "Set-Cookie: username=zhangsan; expires=" +ExpireTimeUseRfc1123(60) + ";"; // 让 cookie 1min 后过期}std::string ProvePath(){return "Set-Cookie: username=zhangsan; path=/a/b;";}std::string HandlerHttp(std::string request){HttpRequest req;req.Deserialize(request);req.DebugHttp();lg.LogMessage(Debug, "%s\n",ExpireTimeUseRfc1123(60).c_str());HttpResponse resp;resp.SetCode(200);resp.SetDesc("OK");resp.AddHeader("Content-Type: text/html");//resp.AddHeader(ProveCookieWrite()); //测试 cookie 被写入与自动提交//resp.AddHeader(ProveCookieTimeOut()); //测试过期时间的写入resp.AddHeader(ProvePath()); // 测试路径resp.AddContent("<html><h1>helloworld</h1></html>");return resp.Serialize();}void Run(){_tsvr->Start();}~Http(){}private:std::unique_ptr<TcpServer> _tsvr;
};

4 -> 单独使用Cookie会存在什么问题

  1. 安全性问题:Cookie中的数据是以明文形式传输的,这意味着在网络传输过程中,数据可能会被截取或篡改。例如,在购物场景中,如果Cookie包含了应付款项等敏感信息,攻击者可以通过在Cookie传回到服务器之前将付款值改小的操作来达到非法目的。此外,存储于本地的密码等敏感信息也可能被钓鱼网站的服务器暴力获取。 
  2. 隐私问题:一些网站可能会利用Cookie来跟踪用户的浏览行为,这可能会涉及到用户的隐私问题。例如,某些网站可能会通过Cookie来记录用户的浏览历史,以便进行针对性的广告推送等操作。 
  3. 数据完整性问题:由于Cookie存储在客户端,用户可以通过浏览器的设置来修改或删除Cookie,这可能会导致数据的完整性受到影响。例如,如果用户修改了Cookie中的某些关键信息,可能会导致服务器无法正确识别用户的身份或状态。 
  4. 性能问题:Cookie会被附加在每个HTTP请求中,这无形中增加了网络流量,尤其是当Cookie数据量较大时,可能会对网络性能产生一定的影响。 
  5. 存储限制问题:Cookie的大小通常有限制(一般在4KB左右),对于一些复杂的存储需求来说可能不够用。例如,如果需要在客户端存储大量的用户数据或者复杂的应用状态信息,Cookie可能无法满足需求。

为了解决这些问题,通常会结合使用Cookie和Session等其他技术。Session将信息默认存储在服务端数据库的表中,而只给浏览器返回一把解锁Session的钥匙(即Session ID),这样可以在一定程度上提高数据的安全性和完整性,同时也能更好地管理用户的会话状态。 


感谢各位大佬支持!!!

互三啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34240.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Echarts使用平面方法绘制三维立体柱状图表

目录 一、准备工作 1.下载引入ECharts库 2.创建容器 二、绘制基本柱状 三、绘制立体柱状方法一 1.定义立方体形状 2.注册立方体形状 3.配置custom系列 4.设置数据 5.渲染图表 四、绘制立体柱状方法二 1.画前知识 2.计算坐标renderItem 函数 &#xff08;1&#x…

考研信息查询系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【…

[高阶数据结构八] B+树和索引原理深度解析

1.前言 B树并不常用,就是因为有B树的存在. MySQL的索引底层其实就是使用了B树,但是B树和索引都是在了解了B树之后才深度学习的&#xff0c;如果你对于B树海一无所知的话&#xff0c;请阅读下面这篇文章。 [高阶数据结构三] B-树详解_b-树csdn-CSDN博客 本章重点&#xff1a; …

Gitee配置以及如何将本地项目提交到远程仓库

文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh&#xff0c;输入以下命令&#xff0c;然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网&#xff1a;https://gitee.com 完成注册 新建仓库 头像->设置-…

圣桥ERP queryForString.dwr SQL注入漏洞复现

0x01 产品描述: 杭州圣乔科技有限公司主要研发全套工业企业ERP系列软件产品,现在公司已经形成ERP 软件、OA办公管理、等四大系列二十小类软件产品。致力于为政府、教育、医疗卫生、文化事业、公共事业(电、水、气等)、交通、住建、应急、金融、电信运营商、企业等用户提供专…

基于MFC框架用C++做一个记账本

目录 一、前言 二、主要功能和技术点 1.主要功能 2.主要技术点 三、准备工作 1.SQLite数据库操作工具 2.SqLiteCpp第三方库 3.安装office导入Excel需要的接口 3.1具体步骤 四、主界面 1.自定义窗口背景 1.1消息映射 1.2选择背景图片 1.3绘制背景 1.4静态控件透明…

qemu搭建aarch64

qemu工具搭建aarch64系统 下载准备 下载qemu: https://qemu.weilnetz.de/w64/2022/qemu-w64-setup-20220831.exe 下载固件&#xff1a;https://publishing-ie-linaro-org.s3.amazonaws.com/releases/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd?Signat…

Zookeeper3.6.3集群安装

Zookeeper3.6.3三节点集群安装 为保证集群高可用&#xff0c;Zookeeper 集群的节点数最好是奇数&#xff0c;最少有三个节点&#xff0c;所以这里搭建一个三个节点的集群。(在一个节点模拟三节点&#xff0c;真实的三节点把ip替换一下即可&#xff0c;按照hadoop案件把网络打通…

下一代 RAG 技术来了!微软正式开源 GraphRAG

省流总结 优点&#xff1a;检索准确度高 缺点&#xff1a;单个19w字构建用时4分30s、gpt4 token花费12美元 概述 7 月 2 日&#xff0c;微软开源了 GraphRAG&#xff0c;一种基于图的检索增强生成 (RAG) 方法&#xff0c;可以对私有或以前未见过的数据集进行问答。在 GitHub…

MySQL索引(四):字符串索引

前缀索引 MySQL是支持前缀索引的&#xff0c; 也就是说&#xff0c; 你可以定义字符串的一部分作为索引。 默认地&#xff0c;如果你创建索引的语句不指定前缀长度&#xff0c; 那么索引就会包含整个字符串。 使用前缀索引的优缺点&#xff1a; 1&#xff09;优点&#xff1a…

获取剪切板的图片 -> File -> Base64 -> Blob -> url -> Image,以及它们之间的各种相互转换

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 一、获取剪切板的图片&#xff08;拿到 File 对象&#xff09; js粘贴事件paste简单解析及遇到的坑 - 云社区 - 腾讯云 (tencent.com) document.addEventListener(paste, f…

实战八:模拟京东购物流程

问题描述&#xff1a; 从键盘录入5个商品信息&#xff08;1001手机&#xff09;添加到商品列表中&#xff0c;展示商品信息,提示用户选择商品&#xff0c;用户选中的商品添加到购物车中&#xff08;购物车中的商品要逆序)&#xff0c;用户选中的商品不存在需要有相应提示&#…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

目录 1、确认浏览器的版本 2、找到对应的chromedriver版本 3、解压chromedriver文件&#xff0c;放置chrome的安装目录下 4、设置系统属性 5、确认chromedriver是否安装成功及解决方式 1、确认浏览器的版本 在浏览器的地址栏&#xff0c;输入chrome://version/&#x…

攻防世界cat-题解

1.打开题目很想是一个命令执行&#xff0c;但是使用命令之心的语句&#xff0c;无法执行命令&#xff0c;看了wp&#xff0c;是在命令执行的时候&#xff1b;被编码了&#xff0c;我们把url%80使它溢出&#xff0c;把显示出来的代码下载到本地分析 分析代码我们可以知道这个是一…

SSM框架

目录 一. Maven入门和进阶 1.Maven简介和快速入门 (1) Maven介绍 (2) Maven的主要作用理解 ①场景概念 ②依赖管理 ③构建管理 (3)Maven安装和配置 ①软件安装 ②环境变量 ③命令测试 ④配置文件&#xff1a; ⑤idea配置本地maven 2.基于IDEA的Maven工程创建 (1…

AI 名人堂:李飞飞

Fei-Fei Li&#xff08;李飞飞&#xff09;&#xff0c;斯坦福大学计算机科学系教授&#xff0c;斯坦福人工智能实验室前主任&#xff0c;以其在人工智能领域的开创性工作而闻名。 人工智能教育的倡导者 计算机视觉领域的领军人物 ImageNet的创造者 2AGI.NET AI 教程 2025最…

基于JavaScript实现的操作系统页面置换算法程序

基于JavaScript的操作系统页面置换算法程序 1. 实验目的 页面置换算法是虚拟存储管理实现的关键&#xff0c;通过本次实验理解内存页面调度的机制&#xff0c;在模拟实现FIFO、LRU等页面置换算法的基础上&#xff0c;比较它们的效率及优缺点&#xff0c;从而了解虚拟存储实现…

JAVA-初始JAVA模块化开发

菜鸟为了巩固所写 目录 菜鸟为了巩固所写 一、概述 二、创建步骤 1、打开Intellij IDEA,创建一个名为MyJavaModuleApp的Java项目。 2、向示例项目中添加”模块描述符“文件 3、创建多模块的IntelliJ 项目 4、IntelliJ项目添加“新模块”对话框 解释1&#xff1a;模块声…

Java 中tableaw 实战教程

java中tableaw库通过简单的API实现过滤、连接、绘制和操作表格数据。支持CSV&#xff0c;数据库&#xff0c;Excel等数据源。 安装依赖 tableaw是用于分析表格数据的开源Java库&#xff0c;构建在Java 8流之上。它可以从GitHub下载&#xff0c;也可以作为Maven或Gradle项目的…

力扣206. 反转链表题解

文章目录 题目描述&#xff1a;试析&#xff1a;1.迭代法2.递归法3.双指针法4.数组法 力扣206. 反转链表 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] …