Test Header HTML Code

关于Cookie与Session

Cookie与Session应该在HTTP协议中会有较准确详细的描述,这里我根据平时看到的资料总结自己的认识如下:

1,Cookie是存储在客户端电脑上面,具有name, domain, expire等属性。

2,出于安全考虑,不能够跨域取cookie,比如a.com的cookie只能由a.com, x.a.com, y.a.com等站点读取,b.com则不可以。

3,cookie具有有效期,一般默认是浏览器关闭则失效,要删除cookie,可以简单的将有效期设置为昨天。

4,客户端每次向服务器发送Request的时候均会自动带上cookie,因此cookie大小不能超过4KB;服务器端通常只是在响应客户端起初的请求时才发送cookie,这里应该是程序控制写入cookie才发送,否则Response不会带cookie。因为cookie主要是用于标示客户端用户的一些信息,而HTTP协议是stateless的,因此若客户端不带上cookie,服务器端无法识别其历史对话信息。

5,对于一些浏览器端禁用cookie的情况,可以通过URL参数或其他形式保留此信息。

6,Session是存储于服务器端,存储客户端会话信息,其实与cookie一样都是存储一些键值对。

7,既然http是stateless的,那么服务器端是如何将session与客户端对应的呢?这里猜想可能是在最初客户端请求时,服务器端为其生成一个session,并将sessionid告诉客户端,每次客户端通过cookie或者其他方式自动带上这个sessionid,那么服务器段就知道它对应哪个session了。并且位于服务器端的session对象可以存储较多的内容。

8,当sessionid被截取后可能会引发安全问题,比如另外一台客户端可以携带该sessionid发送请求模拟登陆,这时我们通常需要通过SSL来解决安全问题。若没有SSL机制,比较简单的办法就是在初始阶段存储客户端的ip地址,http_user_agent等信息,每次处理请求的时候进行一下校验。当然这仍然不是很安全。

9,为了防止黑客自动构造大量sessionid来模仿其他用户,可以在每次session初始化时调用regenerate方法:

<?php
session_start();
if (!isset($_SESSION['initiated']))  //这里是否会识别来自于特定终端的第一次请求,因为不可能每次请求的时候都重新产生一次id
{
session_regenerate_id();
$_SESSION['initiated'] = 1;
}
if (!isset($_SESSION['count'])) $_SESSION['count'] = 0;
else ++$_SESSION['count'];
echo $_SESSION['count'];
?>

10,sessionid的传递应该至少有2种,1种是基于cookie的,另外一种是基于get方法的,比如….?phpsessionid=2321

可以通过ini_set('session.use_only_cookies', 1);强制sessionid基于cookie传送,那么基于get方法的就失效了。

 

Web程序中如何正确使用Session与Cookie,我的个人建议如下:

1,当服务器端收到客户端请求时,首先从Session中判断当前客户端是否是已登陆用户,比如session[‘user’]是否存在。

2,若session中不存在,表明客户未登陆,会话过期,或为新的会话,则读取客户端请求中的cookie值,看其中是否存储了用户名与密码,并对其进行校验,并存储在session[‘user’]中。

3,若用户请求中的cookie也未携带用户名与密码信息,很有可能该用户是第一次登陆或者客户端cookie过期,则从POST或GET中(当然一般是POST)中寻找是否有用户名与密码的值,若校验成功,设置 session[‘user’]值,还可以根据需求生成含有用户名与密码的cookie信息,设置过期时长,比如一天,一周,永远,如果是浏览器关闭则失效,个人觉得没必要设置cookie了,因为有session即可。

4,从此客户端如果浏览器页面不关闭(IE8中默认是整个浏览器不关闭,都会共享同一个会话),则每次发送请求是会自动通过cookie或get方式携带sessionid,则服务气端可以从步骤1中知道该用户已经登陆。若浏览器页面关闭,那么重新打开后,若cookie还有效,那么会通过步骤2处理。否则从步骤3处理。

疑问? cookie可以设置过期时长,那么服务器端session什么时候清楚呢?因为服务器端session只在服务气端管理,服务器端不知道客户端是否已经结束了会话,我们可以在用户点击“退出”按钮时进行此处理,或者关闭页面时,但是关闭页面时有一个问题就是用户可能已经打开了多个页面,不可以关闭其中某一个页面就清除其session信息。但是如果不清除,会造成用户上一次的session还在,用户重新登陆一次后又生成新的session。我想可否再客户端cookie中存储当前站点打开页面的数量,最后一个页面关闭时向服务器端发出一个请求,让其清除session.

posted on 2010-05-03 00:38  宁静的水泡  阅读(2055)  评论(0)    收藏  举报

导航

Test Rooter HTML Code