+ -
当前位置:首页 → 问答吧 → 发现一个很奇怪的现象

发现一个很奇怪的现象

时间:2008-04-03

来源:互联网

发现一个很奇怪的现象!就是使用firefox浏览器时,删除cookie把session也删除了!但是在IE就没有这种情况!请高手解析一下!

作者: liexusong   发布时间: 2008-04-03

不会吧,说清楚点。cookie保存在客户端,session保存在服务器端。客户端不可能强制服务器端去删除session信息。

作者: carche   发布时间: 2008-04-03

不信你可以试试!我就是这样的~

作者: liexusong   发布时间: 2008-04-03

setsession.php
复制PHP内容到剪贴板
PHP代码:

<?php
session_start();
$_SESSION['name'] = 'myname';
?>

getsession.php
复制PHP内容到剪贴板
PHP代码:

<?php
session_start();
echo $_SESSION['name'];
?>

先运行setsession.php,再运行getsession.php,显示myname;删除cookie后ff显示空白,ie显示myname!百思不解!

作者: liexusong   发布时间: 2008-04-03

呵呵..
可能:
1.IE的缓存!
2.IE保存当前在试用的数据!一如你浏览本页,然后清除历史记录!关闭浏览器再打开,这个页面的地址没有被删除!

作者: thaiki   发布时间: 2008-04-03

首先你说的和服务器端没关系,不显示myname,是因为浏览器发送的请求信息中不包含Cookie: SESSIONID 信息,而不是服务器端的session删除的原因。
其次,在IE环境下,你上述程序的cookie信息是保存在内存里的,不借助特殊的工具你是删不掉的,IE自带的删除cookie工具只是删除文件形式的cookie,不删除内存里的cookie。
最后,firefox自带的删除cookie工具是真正将内存的cookie信息删除,当再次发送请求时,由于没有发送cookie保存的sessionid值,当然不会显示myname;如果你手工构造一个cookie值并随请求信息发送出去,不管是ie还是firefox,还是可以得到myname。
如果不指明session信息的存货期限,服务器按php.ini指定的时间保存session信息,过了这个时间自动删除。

作者: carche   发布时间: 2008-04-03

楼上的说的很专业!不过不知道是否是真的~?

作者: liexusong   发布时间: 2008-04-03

继续进行深入探讨吧。

作者: luzhou   发布时间: 2008-04-04

那就深入探讨一下,为方便说明,将楼主的代码稍微加了点东西,以FireFox为例。
session.php
复制PHP内容到剪贴板
PHP代码:
session_start();
$_SESSION['name'] = 'myname';
 //显示服务器发送给浏览器的信息
$response = apache_response_headers( );
foreach ( $response as $key=>$val) {
     echo "$key : $val ";
  }
?>
浏览器输出如下:
复制内容到剪贴板
代码:
X-Powered-By : PHP/5.2.5
Set-Cookie : PHPSESSID=fb59af19cba8de4f1ad4de0aa577f0d7; 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
可以看到,服务器端发送Set-Cookie命令,这时浏览器记下这个值PHPSESSID=fb59af19cba8de4f1ad4de0aa577f0d7;

getsession.php
复制PHP内容到剪贴板
PHP代码:
session_start();
echo $_SESSION['name'];
//显示来自来自浏览器的请求信息
$request = apache_request_headers( );
foreach ( $request as $key=>$val) {
echo "$key : $val
";
}
?>
浏览器输出如下:
复制内容到剪贴板
代码:
myname
Host : localhost
User-Agent : Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4
Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language : zh-cn,zh;q=0.5
Accept-Encoding : gzip,deflate
Accept-Charset : gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive : 300
Connection : keep-alive
Cookie : PHPSESSID=fb59af19cba8de4f1ad4de0aa577f0d7
可以看到,由于浏览器发送了一个Cookie信息,所以能得到myname值。
这时,将cookie信息删除,刷新页面,如楼主所言,firefox下,看不到myname的,输出如下:
复制内容到剪贴板
代码:
Host : localhost
User-Agent : Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4
Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language : zh-cn,zh;q=0.5
Accept-Encoding : gzip,deflate
Accept-Charset : gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive : 300
Connection : keep-alive
Cache-Control : max-age=0
可以看到,浏览器没有发送cookie信息,这是我们得不到myname的根本原因,此时,如果手工构造一个cookie信息会如何,看下面的代码:
send.php
复制PHP内容到剪贴板
PHP代码:

<?php
//手工构造一个请求头,发送我们前面得到的cookie信息
$header = "GET /getsession.php HTTP/1.1\r\n";
$header .= "Host : localhost\r\n";
$header .= "Cookie : PHPSESSID=fb59af19cba8de4f1ad4de0aa577f0d7\r\n";
$header .= "Connection : Close\r\n\r\n";
$fp = fsockopen( "localhost", 80);
if ( fwrite( $fp, $header) ) {
    while ( $data = fgets($fp) ) {
        echo trim($data)."<br>";      
    } 
}

浏览器的输出如下:
复制内容到剪贴板
代码:
HTTP/1.1 200 OK
Date: Sat, 05 Apr 2008 05:24:03 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
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: 134
Connection: close
Content-Type: text/html

myname

我们自己构造的请求头:
Host : localhost
Cookie : PHPSESSID=fb59af19cba8de4f1ad4de0aa577f0d7
Connection : Close
很明显,我们又得到了myname。
客户端的cookie信息是删除了,但服务器端并没有删除session信息,只要客户端发送对应session的cookie值,服务器仍会返回session信息。
再说说IE和FIreFox,如果没有指明Cookie的有效期,Cookie的默认有效期就是进程范围内的,也就是Cookie信息保存在内存里。只要浏览器进程不关闭,Cookie一直有效,每次访问同一个网站,都会发送相应的Cookie信息。
具体到IE,没有自带工具删除内存的cookie,只要进程不关闭,就一直发送cookie信息,这是为什么能看到myname;
FireFox的自带工具是能删除内存Cookie的,只要删除了cookie,FireFox就不会再发送cookie信息,所以你看不到myname。

[ 本帖最后由 carche 于 2008-4-5 14:00 编辑 ]

作者: carche   发布时间: 2008-04-05

也就是说session是可以伪造的

作者: laopi   发布时间: 2008-04-08

很好很强大~~~~~~~

作者: liexusong   发布时间: 2008-04-09