the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


session与客户端cookie的关系

作者:the5fire | 标签:   | 发布:2011-12-08 午夜 | 阅读量: 9004, 8941
以前没有细想过session这个东西怎么保证服务器能够与每个客户端都保持准确的联系,只是以为是浏览器和服务器的协议而已,浏览器和服务器达成某种共识,有一个东西来专门标示客户端在服务器session中的不同。今天和同事讨论到session的问题,算是补上了自己的一个盲点。

session的原理大家都知道一二,在web服务器端,session是以散列表的方式存在(具体的存储形式可能有数据库表、cache、临时文件、服务器端cookie等形式),但在session这个散列表中有一个字段类似于sessionid的东西,是用来记录对应的客户端的,每一个客户端发来请求服务器都会在session中检测该客户端是否携带了sessionid,如果有,表示该客户端与服务器曾经发生过关系。没有,则会为其建立一个sessionid(这个建立的规则我还不清楚),不过这个sessionid会在客户端这次请求完之后带回去,保存。下一次该客户端再来请求,请求中自然就携带了该sessionid,当然,如果在一次请求完成之后,如果你把浏览器的cookie删除的话,sessionid自然就不存在了,所以你的和服务器的会话就找不到了,但是要意识到改会话是存在的。你可以拿百度登录来尝试一下,先登录,然后删除cookie,刷新页面,看看是不是登录状态没有了。

那么,刚才说到,删除cookie,登录状态没有,并不表示你在服务器端的session没了,也就是说,有些情况下,关闭浏览器,并不会消除服务器端的session,只不过是找不到了而已。

所以我们知道,客户端和服务器第一次发生关系(第一次请求)得到的信物sessionid是存在了cookie里。但是作为一个具有多年经验的web开发人员,我表示,无论是在写后台还是写前台的时候,都没有专门或者偶尔写从浏览器发送带有这个信物(sessionid)的任何消息到服务器端,那session为什么依然能准确认出哪些浏览器到底是不是他的相好儿的?so,真相就是,在你带她去访问session的时候,浏览器会偷偷的带上该信物(sessionid)以保证服务器依然记得她。

关于这个我们可以做一个试验来验证一下,这个试验做完在补充上来吧。

另外有些web服务器还可以通过在请求的url总添加类似于sessionid的参数来和服务器端进行认亲。


关于cookie的试验,拿百度来做试验,刚才自己用js试验了一下发现js无法写cookie的domain值为.baidu.com。于是知道找到chrome上面的Edit this cookie插件,完成了这个试验。
具体步骤就是,登录百度之后,找到baidu.com下面的BDUSS这个cookie,删除之,刷新页面,发现已经退出登录,然后自己再用chrome的插件添加该cookie的值,刷新,发现又处于登录态了。

另外还有一个发现,如果我用firefox登录之后,我把firefox中的cookie的BDUSS写到chrome中,发现同样已经变为登录状态了。那么我是不是假如我获取到你浏览器中的cookie的BDUSS值之后,也可以在我的机器上进行登录呢?再来试验一下。

同样也是可以的,不过你只能刷新当前页面,点击其他页面之后百度服务器端会进行验证,会验证完之后会让你当前的cookie失效。至于百度上是怎么验证的,我也很想知道。(另外发现一个问题,如果你把firefox上面的所有cookie都对应的写到chrome中,那么chrome中的那个百度账户将处于登录状态,并且可以进行所有操作,但是firefox这端的登录状态会被注销掉,即cookie已经不起作用,这又是怎么做的呢?PS:再次尝试,发现无法重现)

百度上好像是有严格限制的,但是在csdn上好像没有限制,我只要获取到某一个用户的登录cookie之后,在另一个浏览器上(或者另一台计算机上),可以对该用户的资料、博客等进行任何操作。可以说是绕过了系统的后台认证。



----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: