免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1686 | 回复: 0
打印 上一主题 下一主题

转载:php session原理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-29 09:51 |只看该作者 |倒序浏览
http://www.chinaunix.net/jh/27/600493.html
http://www.chinaunix.net 作者:
夜猫子
  发表于:2008-06-30 12:58:38
       

发表评论


查看原文


Php讨论区
】【
关闭

       
       
       
众所周知,http协议是一个无状态协议,简单来说就是,web服务器是不知道现在连接上来的人到底是哪个人,为了满足选择性发送信息的需求,在http的基础上做了很多扩展来达到这个目的,如数字签名、cookie、session等。
web服务器或者web程序如何能够知道现在连接上来的是谁?要解决这个问题,首先需要在服务器端和客户端建立一一对应关系,下边我通过抓取http的内容来说明这种对应关系是如何建立的。
我使用的是一个叫做httplook的http包嗅探工具,然后在本地web服务器的根目录下建立一个叫test.php的文件,地址是:http://localhost/test.php,一切就绪以后我通过浏览器反复打开这个页面。
;
以下是前两次向服务器发出的信息及服务器返回的信息
引用:原帖由 "第一次请求服务器" 发表:
GET /test.php HTTP/1.1
Accept: */*
Referer: http://localhost/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive

引用:原帖由 "服务器第一次返回" 发表:
HTTP/1.1 200 OK
Date: Fri, 26 Aug 2005 07:44:22 GMT
Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Content-Language: Off

引用:原帖由 "第二次请求服务器" 发表:
GET /test.php HTTP/1.1
Accept: */*
Referer: http://localhost/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3

引用:原帖由 "服务器第二次返回" 发表:
HTTP/1.1 200 OK
Date: Fri, 26 Aug 2005 07:44:23 GMT
Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Content-Language: Off

仔细对比这些输出,第二次请求比第一次请求多出来的就是:
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
这个header将会向服务器发送一个cookie信息,告诉服务器我有一个cookie,名字叫PHPSESSID,内容是bmmc3mfc94ncdr15ujitjogma3。
这个cookie是怎么来的呢?看第一次服务器返回的信息里边有:
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
这是服务器向客户端浏览器写一个cookie,名字是PHPSESSID,值是bmmc3mfc94ncdr15ujitjogma3,这个值实际就是所谓的session_id。
继续看第二次向服务器发出的请求,仍然向服务器发送了PHPSESSID这个cookie
可以得到以下结论:
1、只要使用了session,就会通过cookie的方式向客户端浏览器发送session
2、每次向服务器发出请求的时候,本地浏览器会把cookie附带在请求信息中
说到这里,服务器端和客户端如何通过session做到一一对应的答案就很清楚了,明白了这个道理,对于使用session有很大帮助,请细细体会。

Yarco
回复于:2005-08-31 18:09:05

奇怪...好帖居然没人顶...
请教斑竹.
假如我第二次发送请求不写:
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
是不是意味着服务器端会调用:
$_SESSION['test_sess'] = 0;
这个呢?
ps,居然发现一个变量$_SERVER["HTTP_COOKIE"], 没看到手册里有写.
ps,斑竹有没在win32下好的协议分析工具?
and ps...
实际上我是在翻前几天看到一位兄弟说是关于php5出错不显示错误的问题.
我也遇到了...error_reporting已经设置了E_ALL. 我乱写一通, 居然没反应.
版本php5.0.4
是不是各位普遍有这种情况?

夜猫子
回复于:2005-08-31 18:53:30

>;假如我第二次发送请求不写:
>;Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
isset($_SESSION['test_sess'])就会返回false,结果就是
$_SESSION['test_sess'] = 0;
你的想法是正确的
如果是分析一下http协议的话,telnet 80就可以了,稍微好点就用http look一类的东西,最好的工具是sniffer pro。

hightman
回复于:2005-08-31 20:03:39

哎,都是基于cookie所以特别不安全.
只要这个session_id被知晓或者说cookie内容被盗(这很容易办到), 就很有可能被盗窃身份.
我在作程序时session数据都加入了IP验证.  非根本性的解决方案.

Yarco
回复于:2005-08-31 20:22:22

你这样一说, 我倒是有问题出来了.
cookie被盗, 我相信是指这些情况吧:
1. 就是有n天效果的那种.
2. 被hack或者拦截了
假如不考虑上面因素
按理说那个session_id是个临时值...也按理说临时值对应所储存在服务器端里的文件也是临时的, 用完之后应该被删掉的...
所以再要盗窃身份的话, 是不是说就得找到那个当前在服务器上存在的那个对应的session_id呢?

hightman
回复于:2005-08-31 22:19:56

像论坛上的贴图有些[IMG]标签没过滤好,cookie很容易被获取.

夜猫子
回复于:2005-08-31 22:30:11

session_id的泄露最大的可能是嗅探,如果你处于广播型的以太网内就可以被嗅探

ymaozi
回复于:2008-01-29 17:16:55

楼上说的session_id泄密 还不是特别的明白 ,人家怎么来得到这个session_id 呢?

hualin159
回复于:2008-04-02 18:47:34

顶顶顶

ylcqen
回复于:2008-06-06 16:52:50

嗯,不错.如果不了解可以到PHP官方网站上去查询!

Aryang
回复于:2008-06-08 10:08:53

对于楼主的分析,我来说说自己的看法
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,只要写了,并且没超过有效期,浏览器都能送。

sbc19861004
回复于:2008-06-13 01:13:04

顶!Aryang兄的解释太到位了,受教!

yanglei1979
回复于:2008-06-13 09:32:56

个人感觉,SESSION是存放在服务器端的,COOKIE是存放在客户端的
在服务器端,SESSION值的产生,肯定会和IP地址有关系的,就算是可以伪造IP,但也很难更改服务器端的信息的.
说SESSION有漏洞,不太正确啊

lifeistrue
回复于:2008-06-13 10:47:20

引用:原帖由 Aryang 于 2008-6-8 10:08 发表

对于楼主的分析,我来说说自己的看法
1、只要使用了session,就会通过cookie的方式向客户端浏览器发送session
实际上session完全是一个抽象的概念,session真正要做的,是在除了http提供的get和post提供的参数之 ...

热烈的顶!

[url=http://bbs.chinaunix.net/viewpro.php?uid=417517]7717060

回复于:2008-06-15 21:08:44

学习

haoxing168
回复于:2008-06-30 12:58:38

问个愚昧的问题,我找了一个网站测试,
过程是登陆,然后登陆后跳转到某个页,以下是抓包内容
第一次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.do?origURL=http://x2.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 here
可以看到回的包里没有设置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.do?origURL=http://x2.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内容的。。。。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/74751/showart_1757912.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP