素材牛VIP会员
面试经典问题:Cookie禁用了,Session还能用吗?
 流***雨  分类:PHP代码  人气:1562  回帖:14  发布于6年前 收藏

面试的时候经常被问到Cookie禁用了,Session还能用吗?不同的公司给出的答案也有点不同,到底Cookie禁用了,Session还能用吗?很是郁闷?......

很感谢每一位回答者,也希望能有更好的答案。大家一起加油!

 标签:php

讨论这个帖子(14)垃圾回帖将一律封号处理……

Lv5 码农
Am***ze JS工程师 6年前#1

这个问题下面的所有答案都被人恶意的踩,麻烦管理员出来主持公道

默认SESSION配置

默认的JSP、PHP配置中,SessionID是需要存储在Cookie中的,默认Cookie名为:

  • PHPSESSIONID

  • JSESSIONID

以下以PHP为例:

  1. 你第一次访问网站时,

  2. 服务端脚本中开启了Sessionsession_start();

  3. 服务器会生成一个不重复的 SESSIONID 的文件session_id();,比如在/var/lib/php/session目录

  4. 并将返回(Response)如下的HTTP头 Set-Cookie:PHPSESSIONID=xxxxxxx

  5. 客户端接收到Set-Cookie的头,将PHPSESSIONID写入cookie

  6. 当你第二次访问页面时,所有Cookie会附带的请求头(Request)发送给服务器端

  7. 服务器识别PHPSESSIONID这个cookie,然后去session目录查找对应session文件,

  8. 找到这个session文件后,检查是否过期,如果没有过期,去读取Session文件中的配置;如果已经过期,清空其中的配置

如果客户端禁用了Cookie,那PHPSESSIONID都无法写入客户端,Session还能用?

答案显而易见:不能

并且服务端因为没有得到PHPSESSIONID的cookie,会不停的生成session_id文件

取巧传递session_id

但是这难不倒服务端程序,聪明的程序员想到,如果一个Cookie都没接收到,基本上可以预判客户端禁用了Cookie,那将session_id附带在每个网址后面(包括POST),
比如:

GET http://www.xx.com/index.php?session_id=xxxxx
POST http://www.xx.com/post.php?session_id=xxxxx

然后在每个页面的开头使用session_id($_GET['session_id']),来强制指定当前session_id

这样,答案就变成了:

聪明的你肯定想到,那将这个网站发送给别人,那么他将会以你的身份登录并做所有的事情
(目前很多订阅公众号就将openid附带在网址后面,这是同样的漏洞)。

其实不仅仅如此,cookie也可以被盗用,比如XSS注入,通过XSS漏洞获取大量的Cookie,也就是控制了大量的用户,腾讯有专门的XSS漏洞扫描机制,因为大量的QQ盗用,发广告就是因为XSS漏洞

所以Laravel等框架中,内部实现了Session的所有逻辑,并将PHPSESSIONID设置为httponly并加密,这样,前端JS就无法读取和修改这些敏感信息,降低了被盗用的风险。

Cookie在现代

禁用Cookie是 IE6 那个年代的事情,现在的网站都非常的依赖Cookie,禁用Cookie会造成大量的麻烦。

在Flash还流行的年代,Flash在提交数据会经常出现用户无法找到的情况,其实是因为Flash在IE下是独立的程序,无法得到IE下的Cookie。
所以在Flash的flash_var中,一般都会指定当前的session_id,让Flash提交数据的时候,将这个session_id附带着提交过去
Chrome中使用 Flash沙箱 已经解决了cookie的问题,但是为了兼容IE,比如swfupload等flash程序都要求开发者附带一个session_id

面试者的用意

面试者出此题也是为了考察你对HTTP协议和服务器会话的理解。

Lv5 码农
流***雨 交互设计师 6年前#2

cookie里面存储着sessid吧。 没有这个 服务端怎么获取对应session呢。

Lv2 入门
熊***子 学生 6年前#3

最简单的回答,
客户端禁用cookie采用url重写的方式 ,
也就是上面说的将sessionid写在url上,
这种问题,
最简单的方式 ,
就是自己在本机上禁用cookie试一下就知道了嘛

Lv1 新人
何***孽 软件测试工程师 6年前#4

因为session的数据内容是存储在服务端,单需要一个sessionid通过cookie来写入到客户端,然后服务端才能识别。

如果客户端禁用了cookie,正常情况下session是不能用的。

于是就有人研究怎么突破客户端禁用cookie的限制。

以前看过一篇文章说可以用程序生成一张1像素的图片并指定Etag,然后通过Etag作为识别码在服务端存取数据。

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取