cookie
Cookie 是一些数据, 存储于你电脑上的文本文件中。
当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用 户的信息。
Cookie 的作用就是用于解决 "如何记录客户端的用户信息":
- 当用户访问 web 页面时,他的名字可以记录在 cookie 中。
- 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录。
1、cookie的分类
-
由服务器返回的cookie---Set-cookie
这一类Cookie是由服务端产生的,再发送给客户端保存,用的时候我们直接拿来用就行了。
它的本来面貌是这样子的:Set-Cookie: t7asq_4ad6_saltkey=e4CjZ008; expires=Sat, 18-Jan-2020 06:45:05 GMT; path=/; domain=.discuz.net; httponly Set-Cookie: t7asq_4ad6_lastvisit=1576734305; expires=Sat, 18-Jan-2020 06:45:05 GMT; path=/; domain=.discuz.net Set-Cookie: t7asq_4ad6_lastact=1576737905%09member.php%09logging; expires=Fri, 20-Dec-2019 06:45:05 GMT; path=/; Set-Cookie: domain=.discuz.net
经过格式化后变成抓包时我们看到的样子:
Set-cookie.png -
由JavaScript生成的cookie
JavaScript 可以使用 document.cookie 属性来创建 、读取、及删除 cookie。
JavaScript 中,创建 cookie 如下所示:
document.cookie="username=John Doe";
这一类由JavaScript生成的cookie,需要我们自己去js文件里分析查找它的算法,所以document.cookie
这个要记住,因为它是你查找cookie生成算法时要用到的。
2、cookie的作用
-
识别身份(验证码)
服务器需要通过一段cookie来判断这个验证码是不是你这个链接相对应的,举个简单的例子:
post登录正方教务系统,在登录地址http://jwxt.njupt.edu.cn/
获取得cookie:Set-Cookie: ASP.NET_SessionId=2jmvmp34jiaaf0id0zkvbl55; path=/ WEB=20111152; path=/
在获取验证码时,你要将ASP.NET_SessionId=2jmvmp34jiaaf0id0zkvbl55; WEB=20111152
提交上去,否则取到的验证码就不是ASP.NET_SessionId=2jmvmp34jiaaf0id0zkvbl55; path=/ WEB=20111152; path=/
对应的验证码,登录时会显示验证码错误
-
判断是否访问过某些请求
不同的页面,有些cookie事不一样的 -
判断是否登录状态
你登录后,服务器会返回一个登录成功后的cookie,这个cookie可以用于访问需要这个网页登录才能操作的页面。
以正方教务系统为例,我们需要输入账号密码验证码登录后才能访问主页,其实也可以通过登录后获取到的cookie直接访问主页,当然,cookie必须是还没失效:
cookie访问主页.png
3、cookie的结构
以这段为例,分析cookie的结构
Set-Cookie: t7asq_4ad6_saltkey=e4CjZ008; expires=Sat, 18-Jan-2020 06:45:05 GMT; path=/; domain=.discuz.net; httponly
-
t7asq_4ad6_saltkey=e4CjZ008
:cookie的值,其中-t7asq_4ad6_saltkey
为字段名,e4CjZ008
为字段名的值,用=
隔开 -
;
:分隔作用,分号+空格,最后一个后面不用加 -
expires=Sat, 18-Jan-2020 06:45:05 GMT
:cookie的有效期 -
path=/
:作用的路径 -
domain=.discuz.net
:作用的域名,表明该cookie只在这个域名中可用 -
httponly
:Cookie访问控制,当是httponly
,可以防止程序获取cookie,当是secure
,可防止信息在传递的过程中被监听捕获后导致信息泄露
4、cookie合并更新
当你访问登录地址时,获取到一个cookie,当你访问验证码地址时又获取到了一个cookie,两个cookie里有的字段名可能是相同的,但值不同,这时,旧的值旧只能被放弃掉。
用一个例子来解释比较清晰:
当访问登录地址https://www.discuz.net/member.php?mod=logging&action=login时,得到如下cookie
t7asq_4ad6_saltkey=HE4WI3X7; t7asq_4ad6_lastvisit=1576741783; t7asq_4ad6_lastact=1576745383%09member.php%09logging;
当访问验证码地址https://www.discuz.net/misc.php?mod=seccode&update=66282&idhash=cS时,得到如下cookie
t7asq_4ad6_lastact=1576745383%09misc.php%09seccode; t7asq_4ad6_seccode=3206933.345443c1459be8981e
可以看出,后者t7asq_4ad6_lastact
字段的值变了,且多出来t7asq_4ad6_seccode=3206933.345443c1459be8981e
那么就需要将两个cookie进行合并更新了
1. 对比新的cookie 去除无效cookie
本次合并的cookie中没有需要剔除的无效cookie
2.在新的cookie里面寻找是否存在旧cookie里的名字,存在就用新的cookie替换掉旧的
刚刚找出t7asq_4ad6_lastact
字段的值变了,所以用新的t7asq_4ad6_lastact
字段的值去替换旧的值,替换后两个cookie
t7asq_4ad6_saltkey=HE4WI3X7; t7asq_4ad6_lastvisit=1576741783; t7asq_4ad6_lastact=1576745383%09misc.php%09seccode;
t7asq_4ad6_seccode=3206933.345443c1459be8981e
3.合并两个cookie
将两个cookie合并起来,得到
t7asq_4ad6_saltkey=HE4WI3X7; t7asq_4ad6_lastvisit=1576741783; t7asq_4ad6_lastact=1576745383%09misc.php%09seccode;
t7asq_4ad6_seccode=3206933.345443c1459be8981e
这就是登陆的cookie了
5、抓包流程(论清除cookie的重要性)
抓包时记得清除cookie,不然有些cookie存在的时候,服务器跟js是不会再生成这些cookie的,这会给抓包分析带来干扰