Cookie 禁用了,Session 还能用吗?

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

PHPSESSIONID

JSESSIONID

以下以 PHP 为例:

你第一次访问网站时,

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

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

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

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

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

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

找到这个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
本作品采用《CC 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
本帖由 Summer 于 5年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

老哥最后一个单词少了一个 g
file

6年前 评论

老哥最后一个单词少了一个 g
file

6年前 评论

@Kevinvinvin 一直浏览到最后一个单词。:smile:

6年前 评论

php.ini 有个 use_trans_sid 这个配置,把这个值设置为 1 就可以在每个 url 后面自动加上 session_id=xxxxx 这个参数。

4年前 评论