扫码关注官方订阅号
面试的时候经常被问到Cookie禁用了,Session还能用吗?不同的公司给出的答案也有点不同,到底Cookie禁用了,Session还能用吗?很是郁闷
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
这个问题下面的所有答案都被人恶意的踩,麻烦管理员出来主持公道
在默认的JSP、PHP配置中,SessionID是需要存储在Cookie中的,默认Cookie名为:
PHPSESSIONID
JSESSIONID
以下以PHP为例:
你第一次访问网站时,
服务端脚本中开启了Sessionsession_start();,
session_start();
服务器会生成一个不重复的 SESSIONID 的文件session_id();,比如在/var/lib/php/session目录
session_id();
/var/lib/php/session
并将返回(Response)如下的HTTP头 Set-Cookie:PHPSESSIONID=xxxxxxx
Set-Cookie:PHPSESSIONID=xxxxxxx
客户端接收到Set-Cookie的头,将PHPSESSIONID写入cookie
Set-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
session_id($_GET['session_id'])
这样,答案就变成了:能
聪明的你肯定想到,那将这个网站发送给别人,那么他将会以你的身份登录并做所有的事情(目前很多订阅公众号就将openid附带在网址后面,这是同样的漏洞)。 其实不仅仅如此,cookie也可以被盗用,比如XSS注入,通过XSS漏洞获取大量的Cookie,也就是控制了大量的用户,腾讯有专门的XSS漏洞扫描机制,因为大量的QQ盗用,发广告就是因为XSS漏洞 所以Laravel等框架中,内部实现了Session的所有逻辑,并将PHPSESSIONID设置为httponly并加密,这样,前端JS就无法读取和修改这些敏感信息,降低了被盗用的风险。
聪明的你肯定想到,那将这个网站发送给别人,那么他将会以你的身份登录并做所有的事情(目前很多订阅公众号就将openid附带在网址后面,这是同样的漏洞)。
其实不仅仅如此,cookie也可以被盗用,比如XSS注入,通过XSS漏洞获取大量的Cookie,也就是控制了大量的用户,腾讯有专门的XSS漏洞扫描机制,因为大量的QQ盗用,发广告就是因为XSS漏洞
所以Laravel等框架中,内部实现了Session的所有逻辑,并将PHPSESSIONID设置为httponly并加密,这样,前端JS就无法读取和修改这些敏感信息,降低了被盗用的风险。
httponly
禁用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
flash_var
swfupload
面试者出此题也是为了考察你对HTTP协议和服务器会话的理解。
http的无状态的特性,使得服务器无法知道当前请求者的身份。所以服务器需要给客户端发一个门卡,每个请求过来,刷一下门卡,服务器就知道你是谁了。cookie只是门卡的一种,由于它实现起来比较简单,兼容性也很好,所以广泛应用。其实用url来传递SessionId,也是一个不错的方案。比如 example.com?session_id=xxxxxxx,在服务器上实现一个读取并验证session_id的方法就可以。当然,很多程序员感觉这样暴露Sessionid会不安全。其实,用cookie一样是暴露的,连cookie都拿不到的人,是不可能对你的网站构成威胁的。sessionId的安全性,取决后端的加密算法和过期策略等等。
example.com?session_id=xxxxxxx
最简单的回答,客户端禁用cookie采用url重写的方式 ,也就是上面说的将sessionid写在url上,这种问题,最简单的方式 ,就是自己在本机上禁用cookie试一下就知道了嘛
因为session的数据内容是存储在服务端,单需要一个sessionid通过cookie来写入到客户端,然后服务端才能识别。
如果客户端禁用了cookie,正常情况下session是不能用的。
于是就有人研究怎么突破客户端禁用cookie的限制。
以前看过一篇文章说可以用程序生成一张1像素的图片并指定Etag,然后通过Etag作为识别码在服务端存取数据。
cookie禁用了session是 可以用 的。拿php来说,在php里使用session会在cookie里添加 PHPSESSIONID用来记录用户的session的id。
那么既然cookie禁用了,必然PHPSESSIONID就写不进去了。但是 实现session的方式 并不是只有写cookie这一种啊。
其他方式:
URL重写方式 比如url是 http://xxx.com/?sessionid=xxxxxx 这种的,每次get参数都带上这个id就可以达到相同效果。
hidden input 这种更好理解 就是在form里面加入sessionid。
<input type="hidden" name="sessionid" value="xxxxxxxx" />
宏观上来说Session是Cookie的超集,不过具体实践中Session是服务器边的,而Cookie是客户端边的。
http://stackoverflow.com/ques...
cookie里面存储着sessid吧。 没有这个 服务端怎么获取对应session呢。
Cookie是Session的一种实现机制,Session还有别的实现机制。同样推荐上面@eote发的链接,简短明了
这两个有啥子关系?一个是本地cookie 一个是服务器里的cookie(session差不多就这个意思)
這不一定是一個題目, 你可以先問清楚他要的是php session_* 還是一般意義上的session
session_*
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这个问题下面的所有答案都被人恶意的踩,麻烦管理员出来主持公道
默认SESSION配置
在默认的JSP、PHP配置中,SessionID是需要存储在Cookie中的,默认Cookie名为:
PHPSESSIONID
JSESSIONID
以下以PHP为例:
你第一次访问网站时,
服务端脚本中开启了Session
session_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还能用?答案显而易见:不能
取巧传递session_id
但是这难不倒服务端程序,聪明的程序员想到,如果一个Cookie都没接收到,基本上可以预判客户端禁用了Cookie,那将session_id附带在每个网址后面(包括POST),
比如:
然后在每个页面的开头使用
session_id($_GET['session_id']),来强制指定当前session_id这样,答案就变成了:能
Cookie在现代
禁用Cookie是 IE6 那个年代的事情,现在的网站都非常的依赖Cookie,禁用Cookie会造成大量的麻烦。
面试者的用意
面试者出此题也是为了考察你对HTTP协议和服务器会话的理解。
http的无状态的特性,使得服务器无法知道当前请求者的身份。所以服务器需要给客户端发一个门卡,每个请求过来,刷一下门卡,服务器就知道你是谁了。cookie只是门卡的一种,由于它实现起来比较简单,兼容性也很好,所以广泛应用。其实用url来传递SessionId,也是一个不错的方案。比如
example.com?session_id=xxxxxxx,在服务器上实现一个读取并验证session_id的方法就可以。当然,很多程序员感觉这样暴露Sessionid会不安全。其实,用cookie一样是暴露的,连cookie都拿不到的人,是不可能对你的网站构成威胁的。sessionId的安全性,取决后端的加密算法和过期策略等等。最简单的回答,
客户端禁用cookie采用url重写的方式 ,
也就是上面说的将sessionid写在url上,
这种问题,
最简单的方式 ,
就是自己在本机上禁用cookie试一下就知道了嘛
因为session的数据内容是存储在服务端,单需要一个sessionid通过cookie来写入到客户端,然后服务端才能识别。
如果客户端禁用了cookie,正常情况下session是不能用的。
于是就有人研究怎么突破客户端禁用cookie的限制。
以前看过一篇文章说可以用程序生成一张1像素的图片并指定Etag,然后通过Etag作为识别码在服务端存取数据。
cookie禁用了session是 可以用 的。
拿php来说,在php里使用session会在cookie里添加
PHPSESSIONID用来记录用户的session的id。那么既然cookie禁用了,必然
PHPSESSIONID就写不进去了。但是 实现session的方式 并不是只有写cookie这一种啊。
其他方式:
URL重写方式
比如url是 http://xxx.com/?sessionid=xxxxxx 这种的,每次get参数都带上这个id就可以达到相同效果。
hidden input
这种更好理解 就是在form里面加入sessionid。
<input type="hidden" name="sessionid" value="xxxxxxxx" />宏观上来说Session是Cookie的超集,不过具体实践中Session是服务器边的,而Cookie是客户端边的。
http://stackoverflow.com/ques...
cookie里面存储着sessid吧。 没有这个 服务端怎么获取对应session呢。
Cookie是Session的一种实现机制,Session还有别的实现机制。同样推荐上面@eote发的链接,简短明了
这两个有啥子关系?一个是本地cookie 一个是服务器里的cookie(session差不多就这个意思)
這不一定是一個題目, 你可以先問清楚他要的是php
session_*還是一般意義上的session