session和cookie学习笔记

cookie保存在用户的电脑本地;

setcookie函数若不设置有效时间,则并在关闭浏览器后就失效。

浏览器链接一个URL时,首先搜索当地保存的cookie,如有相关的(根据域名判断),则将它一起提交到服务器。

cookie 中的值设置后只能在下一页生效,而且必须在发送出其它header之前就发出,session_start函数也一样。

同样cookie 中的值删除后,当前页中cookie仍然有效,下一页才会失效。

session中的变量设置或删除后立刻生效。

session不一定必须依赖cookie,这也是session相比cookie的高明之处。



采用COOKIE技术的SESSION实现

在客户端:SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE(cookie名为PHPSESSID);在服务器端保存其他session变量(通过文件或数据库),比如session_name等等。当用户请求服务器时也把session_id一起发送到服务器,通过session_id提取所保存在服务器端的变量,就能识别用户是谁了。同时也不难理解为什么SESSION有时会失效了。

session_id在浏览器关闭时就会失效,因此在客户端的名为PHPSESSID的cookie(一般是这个名字,可以在php.ini中的session.name设置)也会随之删除。

在服务器端:session保存在服务器上的一个文件或服务器的数据库中。当脚本中没有使用session_destory()销毁session时,这个文件会一直保留在服务器端,即使session id已经失效。


URL中传递SESSION ID的方法

由于session也依赖于cookie,因此若客户端禁用cookie,session将失效。

解决的方法是在url中传递session id,这在linux/unix主机中会自动实现

需要保证php.ini中的session.use_only_cookies配置为0(为默认值),才可使用url传递。

url传递session id的几种方法:

1、在连接到另外的页面时,使用 url?SID 的方式通过url传递session

2、也可设置php.ini中的session.use_trans_sid = 1,使得每一个页面中的连接在跳转时候自动附加上SID。


通过url传递SID会带来安全上的风险,主要是附带sid的url传递给第三方后,第三方可能获取该session id对应存在服务器上的session变量。

为此有以下变通的安全方法:

1、通过隐藏表单传递,达到隐藏session id的目的??

2、在服务器端保存session id(通过文本或数据库)

如在page1中session_start()后,将session id保存到服务器的一个文件中,在跳转到page2后,首先打开该文件,从文件中取出$sid(具体名自定),然后使用session_id('$sid')将page2中的session id设置成和page1中的一样,再session_start()即可。



*******免登录的一种解决思路*****

首先在用户本地保存一个cookie,留下session id,和另外一个随机字符串$random,然后在服务器端根据这两者按照某种算法如md5计算一个
数值保存在如$_session['validateNum']中。

当用户下次访问网站时,发送session id和$random给服务器,服务器根据session id取出validateNum,验证是否符合。

若符合,则用户登录。否则,让用户重新登录,以避免伪造cookie.
posted @ 2009-08-20 18:28  awp110  阅读(152)  评论(0编辑  收藏  举报