- ·上一篇文章:构建可配置PHP应用程序的正确方式
- ·下一篇文章:PHP和AJAX打造高级RSS聚合器
跟我来学PHP5:session会话的使用和分析
cookie
URL参数
会话模块支持这两种方法。cookie更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话ID嵌入到URL中间去。
PHP可以透明地转换连接。除非是使用PHP4.2或更新版本,需要手工在编译PHP时激活。在Unix下,用--enable-trans-sid配置选项。如果此配置选项和运行时选项session.use_trans_sid都被激活(修改php.ini),相对URI将被自动修改为包含会话ID。
●session_id
session_id()用于设定或取得当前session_id。php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。
如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start();
当我们使用sessioncookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。
session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。
●检查session是否存在?
在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用isset($_SESSION[‘xxx’])来替代。
●更改session_idsession_regenerate_id()更改成功则返回true,失败则返回false。
使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如:
<?php session_start(); $old_sessionid=session_id(); session_regenerate_id(); $new_sessionid=session_id(); echo"原始SessionID:$old_sessionid<br/>"; echo"新的SessionID:$new_sessionid<br/>"; echo"<pre>"; print_r($_SESSION); echo"</pre>"; ?> |
●session_name()返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start()之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的sessionid.
session改名示例:
<?php $previous_name=session_name("WebsiteID"); echo"新的session名为:$previous_name<br/>"; ?> |
●如何删除session?
1、unset($_SESSION['xxx'])删除单个session,unset($_SESSION['xxx'])用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可将之打入冷宫。
unset($_SESSION)此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。
2、$_SESSION=array()删除多个session
3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的sessioncookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true
session_unset()如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。
下面是PHP官方关于删除session的案例:
<?php //初始化session. session_start(); /***删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/ $_SESSION=array(); /***删除sessinid.由于session默认是基于cookie的,所以使用setcookie删除包含sessionid的cookie.***/ if(isset($_COOKIE[session_name()])){ setcookie(session_name(),'',time()-42000,'/'); } //最后彻底销毁session. session_destroy(); ?> |
由此我们可以得出删除Session的步骤:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()
●SESSION安全:
会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。
评估会话中携带的数据并实施附加保护措施通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害(注:指在URL中显示的会话ID会被别人在电脑屏幕上看到,或被别的网站通过HTTPReferer得到等),则应该启用session.use_only_cookies。此情形下,客户端必须无条件启用cookie,否则会话就不工作。
有几种途径会将现有的会话ID泄露给第三方。泄露出的会话ID使第三方能够访问所有与指定ID相关联的资源。第一,URL携带会话ID。如果连接到外部站点,包含有会话ID的URL可能会被存在外部站点的Referer日志中。第二,较主动的攻击者可能会侦听网段的数据包。如果未加密,会话ID会以明文方式在网络中流过。对此的解决方式是在服务器上实施SSL并强制用户使用。
默认情况下,所有与特定会话相关的数据都被存储在由INI选项session.save_path指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。
上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:
session_encode
函数功能:sesssion信息编码
函数原型:stringsession_encode(void);
返回值:字符串
功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"itisatest\";c|s:4:"lala";a是变量名s:12代表变量a的值"itisatest的长度是12变量间用分号”;”分隔。
session_decode
函数功能:sesssion信息解码
函数原型:booleansession_decode(stringdata)
返回值:布尔值
功能说明:这个函数可将session信息解码,成功则返回逻辑值true
Php5不再使用session_id,而是把它变成一个常量SID,并保存在cookie中。如果客户端禁用了cookie,php会自动通过url自动传动传递SID,其条件是设置php.ini中的session.use_trans_sid=1。此时即使客户端即使禁用了cookie也没关系了。
用strip_tags()
