说说session

作者:云舒

这几天mail list在讨论跨站获取cookie然后登陆网站的事情,昨天下午也发了一些邮件。后来看到还是有人理解不正确,而我刚好又网络坏了,发布出去邮件,快憋死了。今天早上一大早到公司就回复邮件,看来我这性子还真要改改。这里把我发的邮件贴出来,权当笔记了。下面是今天回复的邮件全文。

真的是怒了,昨天到今天一直都在说session,而且大多数是在造谣。昨天网络不通,发不出邮件,差点被憋死了。今天网络貌似不错,我来说说session,以后别老造谣了。

首先,session是由语言实现的,与web服务器无关,比如php的session是php语言实现的。

其次,session的内容是保存在服务器上面的,但是大家都知道session经常用来作认证辨别每个用户,他是怎么和客户端对应起来的?其实很简单,用户提交浏览请求的时候,cookie里面携带了一个session的字段,php就是SESSIONID。这样服务器就知道这个请求者的session保存在这个SESSIONID中,读取对应的数据就可以了。这个SESSIONID又怎么来的?下面再说。

再次,session有默认的超时时间,我记得asp貌似是20分钟,不太确定。所以如果跨站的时候,你拿到了cookie过了很久之后就不能登陆了,这也是以前传说动网论坛跨站了还不能登陆后台的原因,以前不是都传说是因为没法伪造session嘛?因为那时候没有 SessionIE类似的工具可以保持住session不过期。那时候如果刚好管理员被跨站了,还在后台没有退出,你使用这个cookie是可以登陆到后台的,因为你这个sessionid还没过期。

还有,SessionIE这类工具不是万能的。如果web程序写得比较好的话,被跨站的用户退出系统的时候,销毁了cookie和 session,攻击者就没法session的状态不断开。因为这个sessionid对应的session在服务端已经不存在了,虽然你提交了 sessionid,但是在服务端已经没有对应的session数据了,服务端程序取不到认证时需要的session内容,自然无法通过认证。

最后,这类工具可以使用php等支持socket的语言写cgi程序完成,asp的XmlHTTP应该会受到跨域的限制。就是说我在肉鸡上面放一个php程序,定期读取cookie列表,然后使用curl库加载cookie去访问对应的url,保持状态不丢失,这样你就可以关掉自己的 PC了。

最最后,session没什么很神秘或者奇异的地方,它的实质就是服务器端保存的一份数据而已,这份数据都有一个独一无二的ID,这个ID服务器会通过set cookie的方式告诉给客户端。然后客户端请求的时候把这个ID带上,服务端的session就可以和客户端关联起来了。

PS:谢谢cncert的[email protected]在我们的maillist发布新工具,欢迎更多的原创发布!

相关日志

发表评论