免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 夜猫子
打印 上一主题 下一主题

php session原理 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-08 10:08 |只看该作者
对于楼主的分析,我来说说自己的看法
1、只要使用了session,就会通过cookie的方式向客户端浏览器发送session
实际上session完全是一个抽象的概念,session真正要做的,是在除了http提供的get和post提供的参数之外,针对某个用户(可能是个浏览器,或是台电脑,甚至是个ip),能保存额外的信息。如果我们不用系统提供的session,完全也可以传递数据,比如把我们原本要存入session的数据,序列化后再加密,形成一个字符串,在页面上所有的url和form里传递。服务器收到页面请求后,从get或post里取出机密串,揭开,还原数据,实际上和session要做的东西一个样。只不过这种方式超级bt,要实现需要做太多额外的工作。
session从技术角度讲,就是把在网页链接之间,额外要存储的数据,用一个id命名,保存在服务器端,而浏览器只需要每次get或post的适合,只提供这个id,就能获得之前存储的数据。php默认是用文件来保存数据的。unix下,php一般会在/tmp下面,创建 "sess_"+$session_id 这样的文件名,通过这个名字,就能直接找到session_id对应的数据。 所以session最最核心的概念就是:网页间跳转的额外数据,保存在服务器,用一个id标识,浏览器要维持session,需要每次提交都带上这个id。

怎么能让浏览器每次请求都能带上这个id呢,笨办法当然是在每个url链接或form的post里都加个id的参数,有些webmail实际上就是这么做的。当然更简单的办法就是通过cookie保存。但cookie方案还有个问题,如果浏览器不支持cookie怎么办?大家可以试试楼主的代码,把浏览器的cookie功能关闭,看看是个什么效果。

楼主说的session,应该指的是php4,5提供的session功能,要知道php4之前系统都没有提供session功能!而且很多cgi程序,都是完全自己实现的session。我认为第一个结论,清晰的表达应该是:php(4,5)提供的session,系统默认会用cookie来保存session_id

我之前一个项目,用户都在内网使用web。为了方便管理,直接把浏览器ip绑死到一个session,就是用浏览器ip地址代替了sessionid。这个方案里没有cookie,但还算是session,应为他没脱出session的定义。

2、每次向服务器发出请求的时候,本地浏览器会把cookie附带在请求信息中
楼主第二个结论,实际上和session完全没有关系,说的只是http协议里cookie的工作方式。这个cookie是session_start()函数写的,我们也完全可以自己任意写cookie,只要写了,并且没超过有效期,浏览器都能送。

论坛徽章:
0
12 [报告]
发表于 2008-06-13 01:13 |只看该作者
顶!Aryang兄的解释太到位了,受教!

论坛徽章:
0
13 [报告]
发表于 2008-06-13 09:32 |只看该作者
个人感觉,SESSION是存放在服务器端的,COOKIE是存放在客户端的

在服务器端,SESSION值的产生,肯定会和IP地址有关系的,就算是可以伪造IP,但也很难更改服务器端的信息的.

说SESSION有漏洞,不太正确啊

论坛徽章:
0
14 [报告]
发表于 2008-06-13 10:47 |只看该作者
原帖由 Aryang 于 2008-6-8 10:08 发表
对于楼主的分析,我来说说自己的看法
1、只要使用了session,就会通过cookie的方式向客户端浏览器发送session
实际上session完全是一个抽象的概念,session真正要做的,是在除了http提供的get和post提供的参数之 ...

热烈的顶!

论坛徽章:
0
15 [报告]
发表于 2008-06-15 21:08 |只看该作者
学习

论坛徽章:
0
16 [报告]
发表于 2008-06-30 12:58 |只看该作者
问个愚昧的问题,我找了一个网站测试,
过程是登陆,然后登陆后跳转到某个页,以下是抓包内容
第一次post发包登陆
POST /Login.do HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-silverlight-2-b1, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://login.xiaonei.com/Login.d ... .sanguo.xiaonei.com
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; WWTClient2; MAXTHON 2.0)
Host: login.xiaonei.com
Content-Length: 128
Connection: Keep-Alive
Cache-Control: no-cache
Cookie:


email=haoxing168@163.com&password=haoxing&origURL=http%3A%2F%2Fx2.sanguo.xiaonei.com&formName=&method=&submit=%E7%99%BB%E5%BD%95
第一次回包设置cookies
HTTP/1.1 302 Found
Server: Resin/3.0.21
Vary: Accept-Encoding
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://x2.sanguo.xiaonei.com
Set-Cookie: _de=haoxing168@163.com; domain=.xiaonei.com; expires=Thu, 25-Jun-2009 04:26:50 GMT
Set-Cookie: login_email=null; domain=.xiaonei.com; path=/; expires=Thu, 01-Dec-1994 16:00:00 GMT
Set-Cookie: userid=75846582; domain=xiaonei.com; path=/
Set-Cookie: univid=3152; domain=xiaonei.com; path=/
Set-Cookie: gender=1; domain=xiaonei.com; path=/
Set-Cookie: univyear=2003; domain=xiaonei.com; path=/
Set-Cookie: WebOnLineNotice_75846582=1; domain=.xiaonei.com; path=/; expires=Mon, 30-Jun-2008 04:31:50 GMT
Set-Cookie: societyguester=acb9b92cdc6f5df793528dea5af91c5e2; domain=.xiaonei.com; path=/
Set-Cookie: hostid=75846582; domain=.xiaonei.com; path=/
Set-Cookie: id=75846582; domain=.xiaonei.com; expires=Thu, 25-Jun-2009 04:26:50 GMT
Content-Type: text/html
Content-Length: 66
Connection: close
Date: Mon, 30 Jun 200
8 04:26:50 GMT

The URL has moved <a href="http://x2.sanguo.xiaonei.com">here</a>


可以看到回的包里没有设置phpsessid的,
但是浏览器自动跳转后的get包里确有phpsessid不知道为什么,请看第二次get包
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-silverlight-2-b1, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://login.xiaonei.com/Login.d ... .sanguo.xiaonei.com
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; WWTClient2; MAXTHON 2.0)
Host: x2.sanguo.xiaonei.com
Cookie: PHPSESSID=tpiffk5onnfgvau6924nj03u73; __utmaen=1; XNESSESSIONID=abc17zoHQIu_EeTFnvxRr; __utmc=204579609; userid=75846582; univid=3152; gender=1; univyear=2003; hostid=75846582; _de=haoxing168@163.com; WebOnLineNotice_75846582=1; societyguester=acb9b92cdc6f5df793528dea5af91c5e2; id=75846582
Connection: Keep-Alive
Cache-Control: no-cache



看到了吧,PHPSESSID出来了,不知道哪儿来的?回包里没有设置PHPSESSID的cookies内容的。。。。

论坛徽章:
0
17 [报告]
发表于 2011-01-17 16:26 |只看该作者
非常感谢各楼层的角答,祝你们多分享一些难以理解的的知识点.

论坛徽章:
0
18 [报告]
发表于 2011-12-31 14:51 |只看该作者


细致!

论坛徽章:
0
19 [报告]
发表于 2012-08-25 15:31 |只看该作者
每次向服务器发出请求的时候,本地浏览器会把cookie附带在请求信息中

论坛徽章:
0
20 [报告]
发表于 2012-09-04 11:45 |只看该作者
本帖最后由 pianist_cu 于 2012-09-04 11:48 编辑
ymaozi 发表于 2008-01-29 17:16
楼上说的session_id泄密 还不是特别的明白 ,人家怎么来得到这个session_id 呢?


如果你的网站没有使用https连接,那么数据包在网路上传输的时候就是明文传输(根据TCP协议的规则打包),在数据经过的任意一个节点,如网关、路由器等用一个数据包抓取工具(解压、拼接TCP包),就可以轻松获取你的数据包内容,类似电话窃听。

你收发的内容都被截取了,session id 在cookie(http报头)里面,自然也就被别人看到了。

使用https的连接,使用ssl加密了http数据,因为https密钥都是单向加密的(https机制产生两对密钥,发送方一个用于加密,接收方一个用于解密;反之亦然),不能被截获者解密(因为没有密钥。想截获密钥?难于登天,详见https加密机制)。暴力破解?以目前的计算机计算能力,最快的计算机破解https密钥大概要几年、几十年。
所以网银、邮箱都用https协议,就是这个道理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP