好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

解读cookie和session的混乱概念 - 网站安全 - 自学

前几日,因为一些Web的基础概念和职业欠钱兄弟讨论了很久,其中对于session的问题讨论最久,因为各自对session名词和概念的理解不同有了一些小争议,我们俩都知道是什么东西,可就是都木有办法表达清楚,最后绕了个大弯才达成和解,我们彼此只是各自的理解错位了名词的概念而已, 于是我决定把这万恶的session一词多义概念给科普下:

 

首先,http协议原始被设计成了无状态协议,无状态协议通俗点说就是一来一回发个包就木有连接了,后来http 1.1协议支持长连接了,但本质上还是无状态,html5 websocket 就是为了解决这一弊端所设计的,这些是后话了~

 

因为http协议是无状态协议,无法保存用户状态,于是便整出了[session机制],让服务端来保存用户的状态的这一方式。

 

一般脚本语言都会原生支持[session机制],如PHP程序配置:

设置php.ini的 session.use_trans_sid = 1 ,PHP自动在URL里传递session id

设置php.ini的 session.use_cookies = 1 ,使用cookie在客户端保存session id

 

PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过24分钟没有将session id传递过来,服务端就会把session销毁,底层实际上就是服务端的一个一个session文件。 

 

到此,如果理解了这些,我们就可以明晰session的概念了:

很多人将session和cookie说成是两个东西,这是极其不负责的。

session和cookie本质上确实是两个东西 ,但cookie同时也是session id的载体,把session和cookie放在一起讲,包含了session id的cookie应该称为session cookie。象session url和session cookie,它们只是[session机制]中两个不同的实现方式。

 

把cookie单拎出来讲,在客户端可以分为内存cookie和本地cookie, 浏览器 通过cookie的expires字段决定其保存在本地的有效时间,如果未设置expires字段就是内存cookie,结束浏览器进程即消失。cookie在客户端被删除不影响服务端session,服务端session会在有效期过后自动销毁。

 

session还有另外一个翻译名词叫[会话],会话是指多个不同客户端发出不同请求之间的关联关系,简单的说就是HTTP协议依靠session机制来判断客户端的状态,活例子就是同一个账户在两个地方登陆,有人在一个地方改了这个账户的密码,另外一个地方还能发微博,web程序的身份认证只认session,无法知道你改了密码。

 

现在,各种web程序已经自己实现了[session机制],比如discuz程序,我之前的博客[discuz sessoin hijack tips 续]中我提到了根据HASH,UID和UCKEY伪造session的方法,其实这里就体现出了我对于sessoin名词的理解差异和表达错误:

1. discuz这个sessoin其实不是传统意义上的sessoin,而是token,他只是参照[session机制]来模拟的用户身份认证。

2. 这个不叫hijack(劫持),是彻彻底底的伪造一个新token,而discuz是以 数据库 方式保存token的。

 

最后,通过我和职业欠钱兄弟的教训,以后我们讨论技术,切忌不要用单独的名词来讨论笼统的东西,因为一个session的词汇,它能表达出多种含义:

session机制

服务端的 session 文件

session id

session url

session cookie

会话

模拟[session机制]的token

 

ps:

根据redzl网友的意见修改了下本文, session和cookie本质上是两个东西,但概念实在模糊,session一词包含的意义太多,所以本文主题只是分解 session 的各种含义

 

摘自:RAyh4c的黑盒子

查看更多关于解读cookie和session的混乱概念 - 网站安全 - 自学的详细内容...

  阅读:55次