您当前的位置:首页 > 网站建设笔记 >

PHP配置会话控制

0

使用会话

使数据可供Web站点上的多个页面使用的一种方法是使用会话。会话假定数据存储在服务器上,而不是在Web浏览器中,会话标识符用于定位特定用户的记录(会话数据)。这个会话标识符通常通过cookie存储在用户的Web浏览器中,但是,敏感数据本身(如用户的ID、姓名等)总是保留在服务器上。你可能会问:本来cookie工作得好好的,为什么还要使用会话?首先,会话更安全,这是由于所有记录的信息都存储在服务器上,并且不会持续不断地在服务器和客户之间来回发送。其次,可以在会话中存储更多的数据。第三,有些用户拒绝cookie,或者完全关闭它们。虽然会话被设计成与cookie一起工作,但它也可以独立起作用。

会话与cookie,什么时候使用哪一个更合适?

与cookie相比,会话具有以下优点:
❏ 一般更安全(因为数据保存在服务器上);
❏ 允许存储更多数据;
❏ 使用会话时,可以不使用cookie。

与会话相比,cookie则具有以下优点:
❏ 更容易编程;
❏ 需要更少的服务器资源。
一般而言,要存储和检索一两份少量的信息,则可使用cookie。不过,对于大部分Web应用程序都会使用会话。

存储会话ID

在默认情况下,PHP将在会话中使用cookie。如果可能,可以设置一个cookie用来存会话ID。另一个使用会话的方法是将会话ID添加到URL中。如果在php.ini文件设置了session.use_trans_sid指令,则可以自动实现它。当然,启用该设置后,在使用时应该非常小心。因为它增加了站点的安全风险。如果将该指令设置为On,用户就可以将包含该会话ID的URL通过电子邮件发送给其他人,而该URL就可以保存在一个公众可以访问的计算机中,或者在一个公众可以访问计算机的浏览器历史记录或书签。或者,可以手动将会话ID嵌入到链接中,这样它就可以一起传递到用户端。会话ID保存在常量SID中。要手动将其传递过去,需将它添加到一个与GET参数类似的链接末尾:

<a href="link.php<?php echo strip_tags(SID);?>">

在这里,使用strip_tags()函数可以避免一些跨站点的攻击。通常,如果可能的话,选中--enable-trans-sid选项对PHP进行编译会更容易一些。

PHP配置会话控制
选项名默认效果
session.namePHPSESSID会话的名称,在用户系统中用作会话名

设置会话名称
PHP默认使用PHPSESSID会话名。但你可以使用指令session.name把默认值改为任何你想要的名字。
其形式为:session.name=string
session.auto_start0(被禁用)自动启动会话
网页默认只通过调用函数session_start()来启动会话。不过,如果要在网站中一直使用会话,也可以将session.auto_start指令设置为1来自动启动会话。其形式为:session.auto_start=0|1
启用此指令的缺点是无法在会话中存储对象,因为类定义要在会话开始之前加载才能重新创建对象。由于session.auto_start会禁止这一点,所以如果要在会话中管理对象,就要禁用此指令。
session.cache_limiternocache为启用会话的页面设置缓存方向
在处理会话时,如何由用户的浏览器以及位于服务器和用户之间的任何代理来缓存启用会话的页面,session.cache_limiter指令修改这些页面与缓存相关的首部,提供有关缓存首选项的说明。其形式为:session.cache_limiter=string
有5个可用值,如下所示。
❏ none。此设置禁止随启用会话的页面传输任何缓存控制首部。
❏ nocache。这是默认设置。此设置确保对于每个请求,在可能提供缓存的版本之前,先将请求发送到最初的服务器。
❏ private。指定缓存的文档是私有的,该文档只用于最初的用户,不能与其他用户共享。
❏ private_no_expire。这是private的变体,它保证不会向浏览器发送任何文档过期日期。如果发送了Expire首部,又将此指令设置为private,此时各种浏览器就会糊涂,private_no_expire则是这种情况的解决办法。
❏ public。此设置认为所有文档都是可缓存的,但最初的文档请求可能需要验证。
session.cache_expire180为缓存中的会话页设置当前时间,精确到分钟

为启用会话的页面设置缓存过期时间
session.cache_expire指令确定在创建新页面之前,缓存的会话页面可用的秒数(默认为180秒)。
其形式为:session.cache_expire=integer
如果session.cache_limiter设置为nocache,则此指令被忽略。
session.gc_maxlifetime1440设置会话生存期
此指令确定有效会话的持续时间,以秒为单位(默认为1440),在此期间会话被认为是有效的。
其形式为:session.gc_maxlifetime=integer
到达此限制时,会话信息将被销毁,系统资源得以重新分配。默认情况下,它设置为一个特殊的值1440,即24分钟。
session.use_cookies1(允许使用)配置在客户端使用cookie的会话

选择cookie或URL重写
如果要在多次访问网站之间维护用户会话,就应当使用cookie,这样处理器可以重新得到SID,继续原来所保存的会话。如果用户数据只用于一次访问,那么URL重写就足够了。设置此指令为1表示使用cookie进行SID传播,设置为0将使用URL重写。其形式为:session.use_cookies=0|1
记住,启用session.use_cookies时,不需要显式调用cookie设置函数(例如PHP的set_cookie()),因为这会由会话函数库自动处理。如果选择cookie作为跟踪用户SID的方法,还必须考虑其他几个指令。
session.use_trans_sid0自动进行URL重写
如果session.use_cookies被禁用,用户唯一的SID必须要放在URL后面,以确保ID的传播。要实现这个目的,可以手动将变量$SID放到每个URL后面来显式地完成,也可以启用指令session.use_trans_sid来自动完成。
其形式为:session.use_trans_sid=0|1
自然,如果你一定要使用URL重写,就应当启用该指令,以免在重写过程中出现人为失误。
session.cookie_lifetime0cookie会话ID将在用户的机器上延续多久。默认值0表示延续到浏览器关闭

设置会话cookie的生存期
session.cookie_lifetime指令确定会话cookie的有效期。其形式为:session.cookie_lifetime=integer
生存期以秒为单位,所以如果cookie要存活1小时,就要将此指令设置为3600。如果此指令设置为0(默认值),则cookie将一直存活到浏览器重新启动。
session.cookie_path/在会话cookie中要设置的路径

设置会话cookie的有效URL路径
指令session.cookie_path确定cookie在哪个路径中是有效的。对于这个有效路径下的所有子目录,此cookie同样有效。
其形式为:session.cookie_path=string
例如,如果该指令设置为/,则cookie对整个网站都有效。如果设置为/books,则只有在https://www.wangzhanchengxu.com/books/路径中调用cookie才有效。
session.cookie_domainnone指定会话cookie中的域

设置会话cookie的有效域
指令session.cookie_domain确定cookie在哪个域中有效。此指令是必须的,因为它能防止其他域读取你的cookie。
其形式为:session.cookie_domain=string
下面的例子展示了这个指令的用法:
session.cookie_domain=www.wangzhanchengxu.com
如果要在网站子域中使用会话,比如bbs.wangzhanchengxu.comm.wangzhanchengxu.comshop.wangzhanchengxu.com,可以设置此指令为:session.cookie_domain=.wangzhanchengxu.com
session.cookie_secure0(被禁用)确定是否应该在安全连接中发送cookie
session.save_handlerfiles定义会话数据保存的地方。可以将其设置为指向一个数据库,但是需要编写自己的函数

管理会话存储介质
session.save_handler指令确定如何存储会话信息。其形式为:session.save_handler=files|mm|sqlite|user
此数据可以通过4种方法存储:平面文件(files)、共享内存(mm)、SQLite数据库(sqlite)或者用户定义函数(user)。虽然默认设置files对于许多网站来说已经足够了,但要记住,会话存储文件的数量可能会达到几千个,甚至在一段时间后会达到几十万。共享内存选项管理会话的速度最快,但也最不可靠,因为数据存储在RAM中。sqlite选项利用了新的SQLite扩展,通过这个轻量级数据库透明地管理会话信息。第4个选项虽然配置最复杂,但也是最灵活、功能最强大的一个选项,因为可以创建定制处理函数,在网站开发人员所需的任何媒体上存储信息。
session.save_path""会话数据存储的路径。更通常的情况下,传递给存储的参量由session.save_handler函数来处理和定义

如果你使用与其他域共享的服务器,那么把session.save_path从其默认设置(可以被所有用户访问)更改成稍微更本地化一些将会更安全

设置会话文件路径
如果session.save_handler设置为files存储选项,则session.save_path指令必须指向存储目录。
其形式为:session.save_path=string
session.save_path默认设置为/tmp,记住,该指令不能设置为位于服务器文档根中的某个目录,否则可以轻松地通过浏览器危害这些信息的安全。此外,该目录必须是服务器守护进程可写的。
session.hash_function0(MD5)允许指定用来生成会话ID的哈希算法。0表示使用MD5(128位),1表示SHA-1(160位)。这种设置是在PHP 5.0版本中引入的

开始会话

记住,HTTP会忘记用户过去和将来的环境。因此,需要对每次请求显式地启动和恢复会话。两项任务可以使用session_start()函数完成。
其形式为:boolean session_start()
函数session_start()创建一个新会话或继续当前会话,这取决于是否拥有SID。开始会话时,只需如下调用该函数:session_start();
注意,无论结果如何,session_start()函数都会报告成功的结果。因此,使用任何异常处理都不起作用。

销毁会话

尽管可以配置PHP的会话处理指令,根据过期时间或概率自动销毁会话,但有时手工撤销会话也很有用。例如,你可能希望让用户手工注销即登出网站。当用户单击适当的链接时,可以从内存中消除会话变量,甚至从内存中完全清除整个会话,这分别通过session_unset()和session_destroy()函数完成。session_unset()函数清除存储在当前会话中的所有会话变量,它能有效地将会话重置为创建时的状态(没有注册任何会话变量状态)。其形式为:void session_unset()
执行session_unset()确实会删除存储在当前会话中的所有会话变量,但并不会从存储机制中完全删除会话。如果希望完全销毁会话,需要使用函数session_destroy(),该函数从存储机制中完全删除会话,使当前会话失效。记住,这不会销毁用户浏览器中的任何cookie。其形式为:boolean session_destroy()
如果不想在会话之后使用cookie,只需要在php.ini文件中将session.cookie_lifetime设置为0。

建站咨询

咨询热线

微信咨询

返回顶部