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 plaincopy
  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 plaincopy
  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. if (!ImpersonateSelf(SecurityImpersonation)) {
  10. return FALSE;
  11. }
  12. // 指定低权限:
  13. if (!ConvertStringSidToSid(SDDL_ML_LOW, &plntegritySicl)) {
  14. return FALSE;
  15. }
  16. BOOL bRes = FALSE;
  17. if (OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hToken)) {
  18. if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenNew)) {
  19. tml.Label.Attributes = SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED;
  20. tml.Label.Sid = plntegritySicl;
  21. if (SetTokenInformation(hTokenNew, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(plntegritySicl))) {
  22. if (CreateProcessAsUser(hTokenNew, NULL, szCmd, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &procInfo)) {
  23. bRes = TRUE;
  24. }
  25. if (bWait) {
  26. WaitForSingleObject(procInfo.hProcess, 10 * 1000);
  27. }
  28. }
  29. CloseHandle(hTokenNew);
  30. }
  31. CloseHandle(hToken);
  32. }
  33. return bRes;
  34. }

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

COOKIE格式与读写相关相关推荐

  1. axios库读不到cookie_axios中cookie跨域及相关配置示例详解

    自从入了vue之后,一直在用axios这个库来做一些异步请求,下面这篇文章主要介绍关于axios中cookie跨域及相关配置的资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴. 前言 最近 ...

  2. axios跨域携带cookie_axios中cookie跨域及相关配置示例详解

    前言 最近在跨域.cookie 以及表单上传这几个方面遇到了点小问题,做个简单探究和总结.本文主要介绍了关于axios中cookie跨域及相关配置的相关内容,下面话不多说了,来一起看看详细的介绍吧. ...

  3. Android USB OTG U盘读写相关使用最全总结

    Android USB OTG U盘读写相关使用最全总结 https://blog.csdn.net/qq_29924041/article/details/80141514 androidOTG ( ...

  4. cookie记录了服务器相关的信息,使用cookie记录信息(精选).ppt

    文档介绍: 第6章使用cookie记录信息 1 6.1.1 什么是cookie 什么是Cookies("小甜饼") Cookies就是服务器暂存放在你的电脑里的资料(.txt格式的 ...

  5. [原创方法!] 如何实现全自动登录各大网站? Cookie格式 、油猴脚本基础 解决Github邮箱验证,持久登录,免验证码

    之前电脑内存小, 谷歌浏览器又是内存怪物, 每次浏览器不用的时候总是习惯关掉. 这就导致了每次进入常用的网站就要重新登陆, 非常烦;  对! 就是即使浏览器保存了密码, 大部分网站仍然要输入一下验证码 ...

  6. 【温故而知新:文件操作】C#的文件读写相关

    StreamReader类以及其方法ReadLine,Read,ReadToEnd的分析 首先StreamReader类的构造参数非常丰富 在这里,我觉得最常用的就是StreamReader(Stre ...

  7. redis 主从、读写 相关

    1.配置主从 主:6379 从6380 a,配置主从复制方式一.新增redis6380.conf, 加入 slaveof 192.168.152.128 6379, 在6379启动完后再启6380,完 ...

  8. json格式简介和相关操作

    前言:在日常工作中,我们常常会使用json做一些数据的处理,那了解json的一些基础知识和相关操作就尤为重要,本篇就是对于json格式的概括介绍和简单使用. 1.json格式简介 1.1 json基本 ...

  9. zlib库介绍三:gzip(.gz格式)文件读写

    gzip格式文件是一个数据压缩文件,文件大体上分为头部.数据部和尾部. 头部和尾部主要是一些文档属性和校验信息(rfc1952),数据部主要是用deflate方法压缩得到的数据. zlib开源库使用的 ...

最新文章

  1. Mysql 基本命令
  2. java爬树方法_Java-grandMother.java
  3. 阿里云重磅推出物联网安全运营中心Link SOC
  4. WPF-常用布局容器
  5. 软件项目风险管理介绍
  6. centos后台登录ftp_「vscode remote ssh 免登录」mac
  7. Web产品的交互说明文档应该怎么写?
  8. Hive数据如何同步到MaxCompute之实践讲解
  9. java老鸟123怎么样_java入门123——一个老鸟的java学习心得.doc
  10. 是什么成就了卓越的程序员?
  11. PHP 是生还是死?
  12. 如何用JavaScript搭建神经网络?90分钟免费课程,上手可操作丨教程
  13. java common-lang_common-lang3工具类-使用手册
  14. python读取uci数据集
  15. 常用数据库分页查询SQL汇总
  16. 《python深度学习》笔记(八):回归问题
  17. 二进制部署Kubernetes v1.13.4 HA可选 1
  18. 快过年了,Python实现12306查票以及自动购票....
  19. catia 斑马线分析_在CATIA中使用斑马线检查曲面光顺性的方法 | 坐倚北风
  20. 查询每个学生的总成绩的各个科目的分数和姓名,按总成绩排序

热门文章

  1. Android SharedPreferences存储map的方法
  2. O11ycon会议讨论了可观察性的收益和挑战
  3. 明年就翻身系列:AMD 2017统治PC、服务器市场?
  4. 为什么okhttpclient不能builder
  5. 设计模式学习(十六) 模板方法模式
  6. HardwareSoftwareTutorial
  7. 电脑装windows和ubuntu,如何卸载ubuntu系统
  8. Mysql大表的优化
  9. Omi应用md2site发布-markdown转网站利器
  10. 电脑已连接wifi的密码查询