jinhailang / blog

技术博客:知其然,知其所以然
https://github.com/jinhailang/blog/issues
60 stars 6 forks source link

关于Cookie一些思考 #8

Open jinhailang opened 7 years ago

jinhailang commented 7 years ago

我们的系统使用截图方式获取验证码一直不靠谱,偶尔会报错。为了彻底解决这个问题,想着可以使用发送请求方式直接获取验证码。但是,又出现了新问题,对方服务器一直返回“验证码失效的错误”,弄了很久,最后发现,问题出在cookie的处理上。 获取验证码请求会设置 cookie。正常登陆过程,比如登陆页面的 webBrowser 初始 cookie=ck_1,当发送验证码后,webBrowser页面cookie=ck_2。因为我们登录使用webBrowser模拟的方式,而获取验证码使用的 http 直接请求的方式,所以,发送验证码请求获取验证码图片,我们还需要将当前 http 返回的 cookie 写到 webBrowser 的对应cookie 里。可以使用JS的方式:

document.cookie= c.Name=escape(c.value)

但是,这样就可以了吗?webBrowser 是根据 cookie 的路径取相应的 cookie 再发送到服务器进行认证的,但是,上面并没有设置 cookie 路径,而默认路径是在当前目录下,并不一定是根目录。所以,还需要设置 cookie 路径:

document.cookie= c.Name=escape(c.value);path=c.path

只有 cookie 的 name, path, domain 这三个属性都相同,才会被覆盖。取 cookie 的时候会先尾匹配 domian,然后前匹配 path。所以,domin 或 path 详细,当名称相同的时候会被优先使用。例如:

cookie_1:"document.cookie= name=sb1;path=/domain=csdn.net" 
cookie_2:"document.cookie= name=sb1;path=/tt;domain=csdn.net"

同时存在的时候,会使用 cookie_2 的值。 可以通过设置 cookie 有效期,Expire time/Max-age 属性,来删除对应的 cookie。 使用 fiddler 分析 http 请求的时候,有的 cookie 后面有 HTTP-Only 标志,这是为了防止窃取 cookie 的安全机制,设置 HTTP-Only 后,使用 JS 不能访问该 cookie 。 一旦 cookies 通过 Javascript 设置后遍不能提取它的选项,所以你将不会知道 domain, path, expiration 日期或 secure 标记。因此分析 request 的 cookie 的时候,我们只能看到 cookie 的 name 和 value。

参考:

http://www.dannysite.com/blog/77/ http://blog.csdn.net/fangaoxin/article/details/6952954