php session原理
来源:百度文库 编辑:神马文学网 时间:2024/08/28 02:27:41
标题: php session原理[打印本页]
作者: 夜猫子 时间: 2005-8-26 16:10 标题: php session原理
众所周知,http协议是一个无状态协议,简单来说就是,web服务器是不知道现在连接上来的人到底是哪个人,为了满足选择性发送信息的需求,在http的基础上做了很多扩展来达到这个目的,如数字签名、cookie、session等。
web服务器或者web程序如何能够知道现在连接上来的是谁?要解决这个问题,首先需要在服务器端和客户端建立一一对应关系,下边我通过抓取http的内容来说明这种对应关系是如何建立的。
我使用的是一个叫做httplook的http包嗅探工具,然后在本地web服务器的根目录下建立一个叫test.php的文件,地址是:http://localhost/test.php,一切就绪以后我通过浏览器反复打开这个页面。
CODE:
[Copy to clipboard]
session_start();
if (isset($_SESSION[‘test_sess‘])){
$_SESSION[‘test_sess‘]++;
}else{
$_SESSION[‘test_sess‘] = 0;
}
echo $_SESSION[‘test_sess‘];
?>;
以下是前两次向服务器发出的信息及服务器返回的信息
QUOTE:
原帖由 "第一次请求服务器" 发表:
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
QUOTE:
原帖由 "服务器第一次返回" 发表:
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
QUOTE:
原帖由 "第二次请求服务器" 发表:
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
QUOTE:
原帖由 "服务器第二次返回" 发表:
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-8-31 18:09 标题: php session原理
奇怪...好帖居然没人顶...
请教斑竹.
假如我第二次发送请求不写:
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
是不是意味着服务器端会调用:
$_SESSION[‘test_sess‘] = 0;
这个呢?
ps,居然发现一个变量$_SERVER["HTTP_COOKIE"], 没看到手册里有写.
ps,斑竹有没在win32下好的协议分析工具?
and ps...
实际上我是在翻前几天看到一位兄弟说是关于php5出错不显示错误的问题.
我也遇到了...error_reporting已经设置了E_ALL. 我乱写一通, 居然没反应.
版本php5.0.4
是不是各位普遍有这种情况?作者: 夜猫子 时间: 2005-8-31 18:53 标题: php session原理
>;假如我第二次发送请求不写:
>;Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
isset($_SESSION[‘test_sess‘])就会返回false,结果就是
$_SESSION[‘test_sess‘] = 0;
你的想法是正确的
如果是分析一下http协议的话,telnet 80就可以了,稍微好点就用http look一类的东西,最好的工具是sniffer pro。作者: hightman 时间: 2005-8-31 20:03 标题: php session原理
哎,都是基于cookie所以特别不安全.
只要这个session_id被知晓或者说cookie内容被盗(这很容易办到), 就很有可能被盗窃身份.
我在作程序时session数据都加入了IP验证. 非根本性的解决方案.作者: Yarco 时间: 2005-8-31 20:22 标题: php session原理
你这样一说, 我倒是有问题出来了.
cookie被盗, 我相信是指这些情况吧:
1. 就是有n天效果的那种.
2. 被hack或者拦截了
假如不考虑上面因素
按理说那个session_id是个临时值...也按理说临时值对应所储存在服务器端里的文件也是临时的, 用完之后应该被删掉的...
所以再要盗窃身份的话, 是不是说就得找到那个当前在服务器上存在的那个对应的session_id呢?作者: hightman 时间: 2005-8-31 22:19 标题: php session原理
像论坛上的贴图有些[IMG]标签没过滤好,cookie很容易被获取.作者: 夜猫子 时间: 2005-8-31 22:30 标题: php session原理
session_id的泄露最大的可能是嗅探,如果你处于广播型的以太网内就可以被嗅探
作者: 夜猫子 时间: 2005-8-26 16:10 标题: php session原理
众所周知,http协议是一个无状态协议,简单来说就是,web服务器是不知道现在连接上来的人到底是哪个人,为了满足选择性发送信息的需求,在http的基础上做了很多扩展来达到这个目的,如数字签名、cookie、session等。
web服务器或者web程序如何能够知道现在连接上来的是谁?要解决这个问题,首先需要在服务器端和客户端建立一一对应关系,下边我通过抓取http的内容来说明这种对应关系是如何建立的。
我使用的是一个叫做httplook的http包嗅探工具,然后在本地web服务器的根目录下建立一个叫test.php的文件,地址是:http://localhost/test.php,一切就绪以后我通过浏览器反复打开这个页面。
CODE:
[Copy to clipboard]
session_start();
if (isset($_SESSION[‘test_sess‘])){
$_SESSION[‘test_sess‘]++;
}else{
$_SESSION[‘test_sess‘] = 0;
}
echo $_SESSION[‘test_sess‘];
?>;
以下是前两次向服务器发出的信息及服务器返回的信息
QUOTE:
原帖由 "第一次请求服务器" 发表:
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
QUOTE:
原帖由 "服务器第一次返回" 发表:
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
QUOTE:
原帖由 "第二次请求服务器" 发表:
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
QUOTE:
原帖由 "服务器第二次返回" 发表:
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-8-31 18:09 标题: php session原理
奇怪...好帖居然没人顶...
请教斑竹.
假如我第二次发送请求不写:
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
是不是意味着服务器端会调用:
$_SESSION[‘test_sess‘] = 0;
这个呢?
ps,居然发现一个变量$_SERVER["HTTP_COOKIE"], 没看到手册里有写.
ps,斑竹有没在win32下好的协议分析工具?
and ps...
实际上我是在翻前几天看到一位兄弟说是关于php5出错不显示错误的问题.
我也遇到了...error_reporting已经设置了E_ALL. 我乱写一通, 居然没反应.
版本php5.0.4
是不是各位普遍有这种情况?作者: 夜猫子 时间: 2005-8-31 18:53 标题: php session原理
>;假如我第二次发送请求不写:
>;Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
isset($_SESSION[‘test_sess‘])就会返回false,结果就是
$_SESSION[‘test_sess‘] = 0;
你的想法是正确的
如果是分析一下http协议的话,telnet 80就可以了,稍微好点就用http look一类的东西,最好的工具是sniffer pro。作者: hightman 时间: 2005-8-31 20:03 标题: php session原理
哎,都是基于cookie所以特别不安全.
只要这个session_id被知晓或者说cookie内容被盗(这很容易办到), 就很有可能被盗窃身份.
我在作程序时session数据都加入了IP验证. 非根本性的解决方案.作者: Yarco 时间: 2005-8-31 20:22 标题: php session原理
你这样一说, 我倒是有问题出来了.
cookie被盗, 我相信是指这些情况吧:
1. 就是有n天效果的那种.
2. 被hack或者拦截了
假如不考虑上面因素
按理说那个session_id是个临时值...也按理说临时值对应所储存在服务器端里的文件也是临时的, 用完之后应该被删掉的...
所以再要盗窃身份的话, 是不是说就得找到那个当前在服务器上存在的那个对应的session_id呢?作者: hightman 时间: 2005-8-31 22:19 标题: php session原理
像论坛上的贴图有些[IMG]标签没过滤好,cookie很容易被获取.作者: 夜猫子 时间: 2005-8-31 22:30 标题: php session原理
session_id的泄露最大的可能是嗅探,如果你处于广播型的以太网内就可以被嗅探