PHP5之完全SESSION篇

时间: 2009-01-09  分类: php+Mysql  收藏

2、Session常见函数及用法

● 开始一个会话

Session_start()
开始一个会话或者返回已经存在的会话。
说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误:

Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)

 

你 可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。 但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。

请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。

警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。

● 注册SESSION变量

PHP5使用$_SESSION['xxx']=xxx注册SESSION全局变量。和GET,POST,COOKIE的使用方法相似。
注 意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle设为on,不过出于安全考 虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。例如:
Page1.php

  1. <?php   
  2. Session_start(); //使用SESSION前必须调用该函数。   
  3. $_SESSION['name']="我是黑旋风李逵!"; //注册一个SESSION变量   
  4. $_SESSION['passwd']="mynameislikui";   
  5. $_SESSION['time']=time();   
  6. echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>'; //如果客户端支持cookie,可通过该链接传递session到下一页。   
  7. echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';//客户端不支持cookie时,使用该办法传递session.   
  8. ?>  
<?php Session_start(); //使用SESSION前必须调用该函数。 $_SESSION['name']="我是黑旋风李逵!"; //注册一个SESSION变量 $_SESSION['passwd']="mynameislikui"; $_SESSION['time']=time(); echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>'; //如果客户端支持cookie,可通过该链接传递session到下一页。 echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';//客户端不支持cookie时,使用该办法传递session. ?>
Page2.php
  1. <?php   
  2. session_start();   
  3. echo $_SESSION['name']; //   
  4. echo $_SESSION['passwd']; //   
  5. echo date('Y m d H:i:s', $_SESSION['time']);   
  6. echo '<br /><a href="page1.php">返回山一页</a>';   
  7. ?>  
<?php session_start(); echo $_SESSION['name']; // echo $_SESSION['passwd']; // echo date('Y m d H:i:s', $_SESSION['time']); echo '<br /><a href="page1.php">返回山一页</a>'; ?>

 

有两种方法传递一个会话 ID:cookie 和 URL 参数。会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。

PHP 可以透明地转换连接。除非是使用 PHP 4.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();

当我们使用session cookies时,如果指定了一个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_id

session_regenerate_id() 更改成功则返回true,失败则返回false。

使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如:

  1. <?php   
  2. session_start();   
  3. $old_sessionid = session_id();   
  4. session_regenerate_id();   
  5. $new_sessionid = session_id();   
  6. echo "原始 SessionID: $old_sessionid<br />";   
  7. echo "新的 SessionID: $new_sessionid<br />";   
  8. echo"<pre>";   
  9. print_r($_SESSION);   
  10. echo"</pre>";   
  11. ?>  
<?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不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
session改名示例:

  1. <?php   
  2. $previous_name = session_name("WebsiteID");   
  3. echo "新的session名为: $previous_name<br />";   
  4. ?>  
<?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),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true。

session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。

下面是PHP官方关于删除session的案例:

  1. <?php   
  2. // 初始化session.   
  3. session_start();   
  4. /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/   
  5. $_SESSION = array();   
  6. /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/   
  7. if (isset($_COOKIE[session_name()])) {   
  8. setcookie(session_name(), '', time()-42000, '/');   
  9. }   
  10. // 最后彻底销毁session.   
  11. session_destroy();   
  12. ?>  
<?php // 初始化session. session_start(); /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/ $_SESSION = array(); /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的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 会被别人在电脑屏幕上看到,或被别的网站通过 HTTP Referer 得到等),则应该启用 session.use_only_cookies。此情形下,客户端必须无条件启用 cookie,否则会话就不工作。

有几种途径会将现 有的会话 ID 泄露给第三方。泄露出的会话 ID 使第三方能够访问所有与指定 ID 相关联的资源。第一,URL 携带会话 ID。如果连接到外部站点,包含有会话 ID 的 URL 可能会被存在外部站点的 Referer 日志中。第二,较主动的攻击者可能会侦听网段的数据包。如果未加密,会话 ID 会以明文方式在网络中流过。对此的解决方式是在服务器上实施 SSL 并强制用户使用。

默认情况下,所有与特定会话相关的数据都被存储在由 INI 选项 session.save_path 指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文 件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。

分享到:

评论

昵 称: