COOKIE格式与读写相关

二十二:Cookie的格式与约束 为了确保Cookie的正确使用与传输,浏览器和服务器都遵循严格的格式和约束规范。与此同时,Cookie的使用受到多方面的约束,从大小与数量到安全性和生命周期。限制第三方请求(如跨站表单或图片加载)中携带Cookie的能力,减少CSRF(跨站请求伪造)风险。理解并合理使用Cookie,可以帮助开发者构建更安全、可靠的Web应用,同时符合现代隐私保护的要求。属性设置的Cookie会在指定时间后过期,即使浏览器关闭后仍然存在,直到过期时间为止。的Cookie称为会话Cookie,在用户关闭浏览器后自动删除。 阅读详情

1、Cookie文件的实质

Cookie实际上是Web服务端与客户端(典型的是浏览器)交互时彼此传递的一部分内容,内容可以是任意的,但要在允许的长度范围之内。客户端会将它保存在本地机器上(如IE便会保存在本地的一个txt文件中),由客户端程序对其进行管理,过期的Cookie会自动删除。每当客户端访问某个域下某个目录中的网页时,便会将保存在本地并且属于那个域下对应目录的有效Cookie信息附在网页请求的头部信息当中一并发送给服务端。

2、Cookie文件的保存位置

不同的客户端,其Cookie的保存方式、保存位置各不相同,这里只说一下Windows系统中IE的Cookie文件保存位置。

在Windows 2000/XP系统中,Cookie默认保存在C:\Documents and Settings\\Cookies\目录下(此处的为你登录系统时使用的用户名,在开始->运行中输入cookies便可打开该目录),命名规则为@.txt。

与2000/XP不同的是,在Windows 95/98/ME系统中Cookie文件默认是保存在C:\Windows\Cookies\目录下的。

3、Cookie文件的格式

IE的Cookie文件实际上就是一个txt文本文件,只不过换行符标记为Unix换行标记(0x0A),由于记事本对Unix换行标记不兼容,打开后内容全在一行看起来不方便,我们可以用EditPlus或UltraEdit-32打开,打开之后,会看到形式如下的内容:
name
value
domain/
1600
1263382784
30020896
452781968
30020892
*
每一行的内容说明:

英文说明:
Line Summary
1 The Variable Name
2 The Value for the Variable
3 The Website of the Cookie’s Owner
4 Optional Flags
5 The Most Significant Integer for Expired Time, in FILETIME Format
6 The Least Significant Integer for Expired Time, in FILETIME Format
7 The Most Significant Integer for Creation Time, in FILETIME Format
8 The Least Significant Integer for Creation Time, in FILETIME Format
9 The Cookie Record Delimiter (a * character)

中文说明:
第一行 Cookie变量名
第二行 Cookie变量值
第三行 该Cookie变量所属域,形如youkuaiyun.com/、blog.youkuaiyun.com/或blog.youkuaiyun.com/lixianlin/
第四行 可选标志
第五行 该Cookie过期时间(FILETIME格式)的高位整数
第六行 该Cookie过期时间(FILETIME格式)的低位整数
第七行 该Cookie创建时间(FILETIME格式)的高位整数
第八行 该Cookie创建时间(FILETIME格式)的低位整数
第九行 Cookie记录分隔符(为一个星号* )

补充一下,第三行中Cookie变量所属域,如youkuaiyun.com/,它是一个根域,也就是一级域,表示该Cookie变量在该根域下的所有目录中的网页都有效,不管访问该域下的哪个目录中的网页,浏览器都会将该Cookie信息附在网页头部信息当中发送给服务端;blog.youkuaiyun.com/,是一个二级域,表示该Cookie只对blog这个二级域下目录中的网页有效;blog.youkuaiyun.com/lixianlin/,是一个二级域下的目录,只有访问blog这个二级域下lixianlin这个目录中的网页时,才会把该Cookie信息附在请求头部信息当中发送给服务端。需要指出的是youkuaiyun.com/和www.youkuaiyun.com/并不相同,前者是根域,后者是一个二级域,只是人们习惯了www这样的形式,所以大多数的网站首页都用http://www.xxx.com/这样的二级域来访问。

附FILETIME格式定义:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;


1. COOKIE文件格式:

COOKIE文件为操作系统cookies目录下的一堆txt文件。文件名格式为:
<用户名>@<域名>[数字].txt
即,同一个域下可能有多个cookie文件:
elf@sohu[1].txt
elf@sohu[2].txt
elf@sohu[3].txt
文件名中的数字含义不明。实际上,浏览网页时,浏览器会根据cookies目录下index.dat中的索引信息去定位到某一个文件,然后查找相应COOKIE字段值。

COOKIE文件为UNIX格式,只有换行(0x0A)没有回车(0x0D)。每个COOKIE文件内,各字段之间以*分隔,每个字段均包含8行信息:

 

_ntes_nnid                                  // 字段名

456f74e9863f8f4b1a1e37774b0c464d,0            // 字段值

163.com/                                     // 字段所属域

3584                                            // 标志位

3205176064                                // 过期时间(低位)

37425091                                    // 过期时间(高位)

2444768976                                // 创建时间(低位)

30082544                                    // 创建时间(高位)


其中,过期时间和创建时间为FILETIME,需要转成16进制然后拼起来看。标志位标记了一些安全信息,如是否是HTTPONLY(稍后详述)的等等。

2. WININET API对COOKIE的读写

非浏览器客户端想要读写COOKIE,有如下几个函数可用:

  1. InternetGetCookie
  2. InternetSetCookie
  3. InternetGetCookieEx
  4. InternetSetCookieEx

具体参数含义可以参考MSDN,有如下几个地方需要注意的:

1) 上述4个函数的参数lpszCookieName(COOKIE字段名)一般传NULL,而不要按MSDN里说的那样去传一个字段名,否则可能失败。get时,传NULL,会拿到一个类似“name1=value1; name2=value2; ...”这样的字符串,自己去解析一下就好了,但是像标志位、过期时间等信息就丢掉了。set时,传NULL,其它信息(如字段名、值、过期时间)都在lpszCookieData里以固定格式写好传进去:

[cpp]  view plain copy
  1. my_name=my_value; path=/; expires=Sun, 18 Jan 2038 00:00:00 GMT; domain=.sohu.com; HttpOnly  
 

注:上面代码中,时间的格式为"day-month-year hour:minute:second"。

如果名字设置为NULL就会出现一个奇妙的现象,只会插入之后一次设置的cookie,以前插入的就会被查处掉,因为NULL也算成一个lpszCookieName了。这就是为什么经常有人问到 InternetSetCookie为什么只能插入一个cookie呢, 说到底lpszCookieName还是需要的,当然如果只用设置一个cookie可以不需要,毕竟更保险,但是我认为按照MS的说法来做更正确一些,如果要设置多个cookie 那么lpszCookieName必须要, 格式如下:

CString cookie="1; path=/; expires=Sun, 18 Jan 2038 00:00:00 GMT; domain=test.com";
    InternetSetCookie("http://test.com", "test1", cookie);

cookie="2; path=/; expires=Sun, 18 Jan 2038 00:00:00 GMT; domain=test.com";
    InternetSetCookie("http://test.com", "test2", cookie);

插入后 cookie文件中内容如下:

test1
1
test.com/
0
2350186496
32111674
3484819392
30224948
*
test2
2
test.com/
0
2350186496
32111674
3484819392
30224948
*

可以看到已经插入成功,这个插入函数要注意的地方就是 InternetSetCookie的第三个参数lpszCookieData 它的格式不是单纯的 一个数值,而是一个my_value; path=/; expires=Sun, 18 Jan 2038 00:00:00 GMT; domain=.test.com 的格式。错误的写法最容易写成:

CString cookie="1";
    InternetSetCookie("http://test.com", "test1", cookie);

cookie="2";
    InternetSetCookie("http://test.com", "test2", cookie);

这样是不会插入成功的,因为cookie的格式决定了,它有一个有效时间,所在域。所以格式必须完整。

2)在get时,如果参数lpszURL为1级域名,那么会同时拿到该域名下所有2级域名及子目录下的符合条件的COOKIE。如果参数lpszURL为2级域名,会同时拿到所有子目录下的符合条件的COOKIE。如http://sohu.com,会拿到http://bai.sohu.com下的COOKIE。

3) VISTA和WIN7,且IE7或IE8时,IE默认开启保护模式,此时IE读写的cookie不是在cookies目录下,而是cookies目录的low目录下。而客户端是从哪个目录下去读取COOKIE,就取决于当前客户端进程的权限:普通权限进程拿cookies目录,受限(LOW)权限拿LOW目录。如果进程是以普通权限启动的,想拿LOW目录下的COOKIE,就需要以低权限启动另外一个进程,用子进程去拿:

[cpp]  view plain copy
  1. {  
  2.     HANDLE hProcess = GetCurrentProcess();  
  3.     HANDLE hToken = NULL, hTokenNew = NULL;  
  4.     PSID plntegritySicl = NULL;  
  5.     TOKEN_MANDATORY_LABEL tml = {0};  
  6.     PROCESS_INFORMATION procInfo = {0};  
  7.     STARTUPINFO StartupInfo = {0};  
  8.     ULONG ExitCode = 0;  
  9.       
  10.     if (!ImpersonateSelf(SecurityImpersonation)) {  
  11.         return FALSE;  
  12.     }  
  13.     // 指定低权限:  
  14.     if (!ConvertStringSidToSid(SDDL_ML_LOW, &plntegritySicl)) {  
  15.         return FALSE;  
  16.     }  
  17.     BOOL bRes = FALSE;  
  18.     if (OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hToken)) {  
  19.         if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenNew)) {  
  20.             tml.Label.Attributes = SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED;  
  21.             tml.Label.Sid = plntegritySicl;  
  22.             if (SetTokenInformation(hTokenNew, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(plntegritySicl))) {  
  23.                 if (CreateProcessAsUser(hTokenNew, NULL, szCmd, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &procInfo)) {  
  24.                     bRes = TRUE;  
  25.                 }  
  26.                 if (bWait) {  
  27.                     WaitForSingleObject(procInfo.hProcess, 10 * 1000);  
  28.                 }  
  29.             }  
  30.             CloseHandle(hTokenNew);  
  31.         }  
  32.         CloseHandle(hToken);  
  33.     }  
  34.     return bRes;  
  35. }  
 

4) 在IE7及以后,cookie引入了一个属性HTTPONLY,值为0x2000。该标志是一个安全性标志,如果一个COOKIE字段具有该属性(标志位具有0x2000这一位),则网页脚本无法获取该字段,此字段只存在于http请求的HEADER中。而对于客户端,则有:
IE6或IE7环境下:客户端无法通过InternetGetCookie获取此字段值,只能读取COOKIE文本,然后手动解析(参考第一部分:COOKIE文件格式)。
IE8环境下:客户端可以通过InternetGetCookieEx,且参数dwFlags包含0x2000,来获取此字段值。

JavaScript中读写Cookie的代码 首先,我们将名称和值编码为URI格式,并将它们拼接为一个字符串。然后,如果指定了过期时间,我们创建一个新的Date对象,并将其设置为当前时间加上过期时间的毫秒数,然后将过期时间转换为UTC格式,并将其添加到Cookie字符串中。在JavaScript中,我们可以使用document对象的cookie属性来读取和写入Cookie。请注意,由于浏览器的安全限制,你只能读取和写入与当前网页域名相关的Cookie。然后,我们遍历这个数组,将每个Cookie以等号分隔为名称和值,并使用。表示Cookie的名称, 阅读详情

相关推荐

从轻量化到高精度:3DXML 转 STP 的工程数据升级技术指南

本文详细解析了3DXML转STP格式的工程数据升级技术,对比了两种格式在轻量化和高精度方面的特性差异,并提供了CATIA、FreeCAD及Python编程等多种专业级转换方案。通过实际案例展示了如何确保转换过程中的数据精度,适用于CAD设计、精密制造等场景,帮助工程师实现工程数据的高效升级。

weixin_29201859的博客 215

Cookie的格式及组成

 Cookie由变量名和值组成,类似Javascript变量。其属性里既有标准的Cookie变量,也有用户自己创建的变量,属性中变量是用“变量=值”形式来保存。  根据Netscape公司的规定,Cookie格式如下:  Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE  NAME=VALUE:  这是每...

xeh的专栏 1710

OpenClaw的引导配置(onboard)流程

脚本安装的直接安装完到引导配置界面,其他安装方式还可以直接命令到配置。

supersolon的专栏 1327

解决Javaweb后端中Cookie值中存在无效字符的问题

对Cookie值中存在无效字符的一般原因进行了分析,并且说明该错误的原因一般是编码的错误,此时我们通过URLEncoder.encode()进行编码即可解决

wangye135的博客 1006

D类功放LC滤波器实战:从Q值0.707到EMI优化的完整设计流程

本文详细解析了D类功放LC滤波器的完整设计流程,从确定截止频率与Q值0.707的理论基础出发,到参数计算、仿真验证及关键元器件选型,并提供了应对EMI超标和过流保护等实际问题的进阶调试策略。文章强调,精准的LC滤波器设计是平衡音质、稳定性与电磁兼容性的关键,尤其需关注电感饱和电流与电容直流偏置等细节。

e4f5g6h7的博客 1036

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 480

Cookie基础

关于Cookie: 1、Cookie 是什么 Cookie 全称 HTTP Cookie,简称 Cookie // 是浏览器存储数据的一种方式 // 因为存储在用户本地,而不是存储在服务器上,是本地存储 // 一般会自动随着浏览器每次请求发送到 服务器端 2、Cookie 有什么用 利用 Cookie 跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等 3、在浏览器中操作 Cookie 不要在 Cookie 中保存密码等敏感信息 Cookie 的基本用法: 1.写

Ahrichan的博客 1076

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3934

HTTP1.1(十一)Cookie的格式与约束

Cookie的格式与约束。

wzj_110的博客 1284

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 938

Altium Designer应用技巧1: 功能模块的复用方法

Altium Designer应用技巧1: 功能模块的复用方法      我们在使用Altium Designer进行电路图设计时,常会遇到功能模块的复用问题,例如我们经常需要将12V以DC-DC的方式转换成5V,这在很多线路板上都会应用到。现在我们普通的做法是,每个板子都重新绘制一遍,像这样DC-DC的电路,很浪费时间。那么如何采用提高工作效率呢?我们可以采取Altium Desi

snmplink的博客 1万+

JSON数据和本地存储

eXtensible Markup Language,可扩展标记型语言(1)标记型语言:html是标记型语言,都是使用标签进行操作。xml里面的操作也是使用标签进行操作。(2)可扩展:html里面的标签,每个标签有自己特定的含义,比如<br/> <hr/>在xml中标签自己定义的,比如 <aa> <猫>(3)xml的主要的功能是存储数据(不是显示数据)

Aming_888的博客 952

π0.5部署实战(一) ------ 在Thor上使用NVFP4量化

此篇文章是pi05模型在thor上部署系列文章的第一篇.主要介绍如何对pi05 2.6B LLM(Gemma)使用nvfp4进行量化.所有操作使用开源工具可以先参考进行环境的准备和安装,在上完成以下操作.

happyAnger6的专栏 407

Cookie与WebStorage

Cookie与WebStorage

雷神乐乐的博客 751

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Cookie相关知识

原文链接 2. 什么是cookie HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服...

luoyooi的博客 240

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JSP中的COOKIE操作

Cookie概念:Cookie的格式实际上是一段纯文本信息, 由服务器随着网页一起发送到客户端,并保存在客户端硬盘中指定的目录的. 大家都传说Cookie会造成严重的安全威胁什么的, 其实不是这么回事情. 服务器读取Cookie的时候,只能够读取到这个服务器相关的信息. 而且, 浏览器一般只允许存放300个Cookie, 每个站点最多存放20个, 而且,每个Cookie的大小现在在4K

xiaoyycq的专栏 872

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Javascript 读写cookie

cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制,而并不是JavaScript本身的性质。cookie是 存于用户硬盘的一个文件,这个文件通常对应于一个域名,当浏览器再次访问这个域名时,便使这个cookie可用。因此,cookie可以跨越一个域名下的 多个网页,但不能跨越多个域名使用。...

认真搞技术 329

JSP中的Cookie使用

Cookie概念:    Cookie的格式实际上是一段纯文本信息, 由服务器随着网页一起发送到客户端, 并保存在客户端硬盘中指定的目录的. 大家都传说Cookie会造成严重的安全威胁什么的, 其实不是这么回事情. 服务器读取Cookie的时候, 只能够读取到这个服务器相关的信息. 而且, 浏览器一般只允许存放300个Cookie, 每个站点最多存放20个, 而且, 每个Cookie的大小现在在4

lengyuhong的专栏 1130

【HTTP】请求“报头”,Referer 和 Cookie

描述了当前这个页面是从哪里来的(从哪个页面跳转过来的)referer。当你在sogou页面进行搜索时,新进入的网页就会有referer有一个非常典型的用途:广告中referer这种情况在十年前左右是非常常见的,运营商(中国移动/中国联通/中国电信)进行篡改。refererrefererHTTPreferer这种行为叫“运营商劫持”。当年,互联网那个还是个新鲜东西,对应的法律还不是特别的完备。

Yeeear的博客 2万+

Cookie

1、cookie 是个啥? cookie 是保存在客户端系统中的一个文本文件,每个 cookie 文本文件都与指定 Web 服务器的域中的固定目录相关联。当浏览器向服务器请求该目录下的页面时,关联的 cookie 信息就会随着 HTTP 请求以头部信息的方法是送给服务器。这句话不理解没有关系,请往下看。 HTTP 协议本身是无状态的。无状态是指Web浏览器与Web服务器之间不需要建立持久的连接...

Yingjieweb 的技术博客 487

php会话控制(session与cookie)

cookie简介Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据。一般情况下,Cookie通过HTTP headers从服务端返回到客户端。多数web程序都支持Cookie的操作,因为Cookie是存在于HTTP的标头之中,所以必须在其他信息输出以前进行设置,类似于header函数的使用限制。PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的

手艺人小在的博客 3242

设置cookie存活时间_前端须知的 Cookie 知识小结

cookie 是什么和使用场景cookie是服务器端保存在浏览器的一小段文本信息,浏览器每次向服务器端发出请求,都会附带上这段信息(不是所有都带上,具体的下文会介绍)使用场景:对话管理:保存登录、购物车等需要记录的信息个性化:保存用户的偏好,比如网页的字体大小、背景色等等追踪:记录和分析用户的行为以上用得较多的还是第一种场景。我们有时候用cookie作为客户端储存,可行但不推荐。因...

weixin_39634876的博客 1034

如何用Chrome读懂网站监测Cookie

作者 | 朱顺意责编 | 李雪敬出品| 优快云云计算(ID:优快云cloud)网站监测工具用于标识用户的 Cookie 分为第1方 Cookie 和第3方Cookie,这两者本质...

优快云云计算 2411
上一篇: VC删除IE缓存、COOKIE及记录
下一篇: VC编译错误总结
章志强
博客等级 码龄15年 523粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值