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.