cookie
来源:互联网 发布:vr资源 知乎 编辑:程序博客网 时间:2024/06/08 10:20
1. COOKIE文件格式:
COOKIE文件为操作系统cookies目录下的一堆txt文件。文件名格式为:
<用户名>@<域名>[数字].txt//重点:COOKIE文件名格式为:你的用户名@产生的COOKIE的网页文件所在的WEB目录[COOKIE改变的次数].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(稍后详述)的等等。
通过分隔分号加空格符号,就可以获得各个 cookie,再通过分隔等号,就可以得出各个 cookie 的名称和值。
cookie 的子键,只是表现在 cookieValue 上,一个子键的结构是:子键名称=子键值,多个子键之间用 & 连接起来。比如:
cookieName1=子键名称1=子键值1&子键名称2=子键值2
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里以固定格式写好传进去:
view plaincopy to clipboardprint?
01.my_name=my_value; path=/; expires=Thu, 07-Mar-13 09:15:47 GMT; domain=.sohu.com; HttpOnly
my_name=my_value; path=/; expires=Thu, 07-Mar-13 09:15:47 GMT; domain=.sohu.com; HttpOnly
注:上面代码中,时间的格式为"day-month-year hour:minute:second"。
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目录。以PinyinUp.exe为例,因为输入法的进程总是以普通权限启动的,想拿LOW目录下的COOKIE,就需要以低权限启动另外一个进程,用子进程去拿:
view plaincopy to clipboardprint?
01.{
02. HANDLE hProcess = GetCurrentProcess();
03. HANDLE hToken = NULL, hTokenNew = NULL;
04. PSID plntegritySicl = NULL;
05. TOKEN_MANDATORY_LABEL tml = {0};
06. PROCESS_INFORMATION procInfo = {0};
07. STARTUPINFO StartupInfo = {0};
08. ULONG ExitCode = 0;
09.
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.}
{
HANDLE hProcess = GetCurrentProcess();
HANDLE hToken = NULL, hTokenNew = NULL;
PSID plntegritySicl = NULL;
TOKEN_MANDATORY_LABEL tml = {0};
PROCESS_INFORMATION procInfo = {0};
STARTUPINFO StartupInfo = {0};
ULONG ExitCode = 0;
if (!ImpersonateSelf(SecurityImpersonation)) {
return FALSE;
}
// 指定低权限:
if (!ConvertStringSidToSid(SDDL_ML_LOW, &plntegritySicl)) {
return FALSE;
}
BOOL bRes = FALSE;
if (OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hToken)) {
if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenNew)) {
tml.Label.Attributes = SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED;
tml.Label.Sid = plntegritySicl;
if (SetTokenInformation(hTokenNew, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(plntegritySicl))) {
if (CreateProcessAsUser(hTokenNew, NULL, szCmd, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &procInfo)) {
bRes = TRUE;
}
if (bWait) {
WaitForSingleObject(procInfo.hProcess, 10 * 1000);
}
}
CloseHandle(hTokenNew);
}
CloseHandle(hToken);
}
return bRes;
}
4) 在IE7及以后,cookie引入了一个属性HTTPONLY,值为0x2000。该标志是一个安全性标志,如果一个COOKIE字段具有该属性(标志位具有0x2000这一位),则网页脚本无法获取该字段,此字段只存在于http请求的HEADER中。而对于客户端,则有:
IE6或IE7环境下:客户端无法通过InternetGetCookie获取此字段值,只能读取COOKIE文本,然后手动解析(参考第一部分:COOKIE文件格式)。
IE8环境下:客户端可以通过InternetGetCookieEx,且参数dwFlags包含0x2000,来获取此字段值
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/windless0530/archive/2010/06/07/5653248.aspx
- Cookie
- cookie
- cookie
- Cookie
- cookie
- Cookie
- cookie
- Cookie
- Cookie
- Cookie
- cookie
- cookie
- cookie
- Cookie
- cookie
- Cookie
- cookie
- cookie
- Hadoop Streaming 实战: c++编写map&reduce程序
- Kernel Knowledge
- 当前几个主要的Lucene中文分词器的比较
- 单片机+硬件小笔记
- HashMap的两中迭代方式(源代码解析)
- cookie
- php中利用memcache/memecached构造简单消息队列
- 出现频率最高的笔试题strcpy写法
- 为Oracle数据库安装制定计划
- UrlRewritingNet 实现伪静态
- 带加号的验证码
- jQuery.validate 中文API
- 一个古老的编程题
- 阶段性困境