1,session默认依文件形式存放在服务器上,用sessionid加前缀的方式命名此session文件。当调用session_start()使启用session,此时会生成一个sessionid。用session_regenerate_id()函数可以生成sessionid
注:用户向服务器请求的时候,在请求的头信息中会set_cookie,服务器端会根据获得的sessionid到对应的session文件中取得session数据然后返回给客户端。所以当第一次请求是不会有sessionid给服务器端,只是在第一次会生成一个sessionid,当第二次请求的时候会发送这个sessionid。
注:sessionid在客服端是存放在session cookie name中的(php默认的是PHPSESSID,可以在php.ini中修改),即:sessionid在客服端依cookie的方式存放
2,如果客服端禁用cookie的话,虽然session是依赖cookie中的sessionid的,但是sessionid可以明文传输的,比如在url中加?PHPSESSID=session_id()。session_name()函数可以获取
session cookie name,默认的话即是PHPSESSID。
php.ini中的session.use_trans_sid设置为ON即可,但是会有一定的安全性,攻击者可以发送包含会话 ID 的 URL 给受害者, 例如:http://example.com/page.php?PHPSESSID=123456789
3,注销session:
session_destroy();// 第一步: 删除服务器端session文件,这使用 setcookie(session_name(),'',time()-3600);// 第二步: 删除实际的session: $_SESSION = array();// 第三步: 删除$_SESSION全局变量数组
4,购物车的实现
一般的方法是:放在cookie中(安全性问题),放在session中(session文件过大),放在数据库中(加大数据库的负载)
可以通过会话id即sessionid,同时把session放到redis或memcached中,通过sessionid到nosql中去取得数据。
5,防止伪造sessionid
可以在登陆验证成功后,重新生成一个sessionid
<?php
if(!isset($_SESSION['user_agent'])){ $_SESSION['user_agent'] = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']); } /* 如果用户session ID是伪造 */ elseif ($_SESSION['user_agent'] != md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'])) { session_regenerate_id(); } ?>注:在服务器端加再加一个user_agent的session,这个session是用户的ip和浏览器的md5加密值,判断是否是这个用户。
session和cookie的区别见http://news.tuxi.com.cn/kf/article/mnnpj.htm