一,区别与联系
cookie是将数据储存在客户端,而session则是保存在服务器端。仅仅是在客户端储存一个ID。所以session比cookie安全。但,session 的运行依赖 session id,而 session id 是存在 cookie 中的,PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中也就是说,如果 浏览器禁用了 cookie ,同时 session 也会失效(当然也可以在 url 中传递),可以进行更改session默认名称进行sessionid的防御。如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。通过 php.ini 中session.name来修改,也可以通过函数session_name()来修改。
二,各自特点
cookie
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间(setMaxAge(606024)),浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
在cookie不过期时只要获取到cookie大多都能无密码登录,因为有些只是用cookie储存临时信息而不是身份验证。
session
因为每次关闭浏览器PHPSESSID会自动删除,这只是客户端被删除了,服务端没有被删除。若重新登录则会分配新的PHPSESSID。
使用session_destroy();使当前PHPSESSID失效,也就是会话结束后。即使拥有PHPSESSID也通过不了验证。但若在其他浏览器输入没有被关闭的PHPSESSID还是可以无密码登录。
所以只要在session的一个id的生命周期未结束前就可以通过PHPSESSID登录,
也就是可以进行会话劫持。