PHP的Session机制

  客户端浏览器和服务器之间通信使用的http协议是一种无状态的协议,在它看来,客户端发起的每个请求都是独立、没有关联的。然而,在实际的Web应用开发中,服务器却经常需要根据用户以往的一些状态或数据对请求做出相应的应答,所以需要记录用户的某些状态或数据。Session就是用于保持客户端请求和服务器应答之间的上下文联系,本文主要介绍PHP的Session机制。

  PHP的Session机制的工作过程大致是这样子的:当客户端浏览器向服务器发起一个请求的时候,服务器会检查请求数据包头部中的“Cookie”字段是否包含名称为session.name的变量(session.name是PHP的配置文件php.ini中的一个配置项,用于配置服务器使用的session的名称,默认为“PHPSESSID”),该变量的值即为sessionid,即:$_COOKIE[session.name]=sessionid。若不存在,PHP会在session.save_path配置的路径目录下生成一个文件(session.save_path也是PHP的配置文件php.ini中的一个配置项,配置服务器session文件放置的位置),同时生成一个sessionid,这个文件的名称即为“sess_”和sessionid拼凑而成。然后在发送给浏览器的数据包头部中的Set-Cookie字段中指定session的名称和对应的sessionid,浏览器则根据该字段的信息在内存中创建一个Cookie,严格来说叫SessionCookie。下一次浏览器再访问服务器的时候便会在数据包头部的Cookie字段中加入该Cookie。若服务器发现浏览器请求包头部中“Cookie”字段包含了名为session.name的sessionid,就会根据该sessionid到session.save_path指定的路径下找到名称为“sess_”+sessionid的文件,对文件进行读取或写入操作,开始了和客户端之间的会话。

  由于SessionCookie是存在于浏览器内存中的,所以当浏览器关闭的时候,原来的SessionCookie也就消失了,下一次访问同一个服务器需要再次创建session文件和Cookie。这样一来,服务器中原来的session文件也就没有用处了。在PHP的配置文件php.ini中,使用配置项“session.gc_maxlifetime”来设置session文件的生存期,超过这个时间期限的文件数据都将被视为垃圾,并由垃圾回收程序处理。垃圾回收程序是在会话初始化时启动的,但并不是每一次都会启动,是有一定概率的,PHP配置文件中使用“session.gc_probability”和“session.gc_divisor”这两个配置项来设置这个概率,计算公式为:session.gc_probability / session.gc_divisor。

  以上讲述的是使用Cookie来存储sessionid的方法,这也是PHP默认的存储sessionid的方法。当客户端的Cookie出现问题的时候,如:用户设置浏览器禁用cookie,session就会受到影响了。不过我们可以通过其他方法来存储sessionid,主要有以下三种方法:

  1. 设置文件php.ini中的session.use_trans_sid = 1,可以让PHP自动跨页传递sessionid(PHP会自动把sessionid附着在URL中)。

  2. 手动通过URL传值,或通过隐藏表单字段传递sessionid。

  3. 使用文件、数据库等形式保存sessionid,在跨页过程中手动调用。

  在方法二中,第一次调用session_start()函数时,PHP会创建一个session文件并产生一个sessionid,可以通过session_id()函数获得该sessionid,将sessionid拼接在url后面通过get方法传递(这种方法是存在很大的安全问题的),或者将sessionid作为表单的隐藏字段使用post方法传递,然后在下一个页面中可以把传过来的sessionid作为参数传递给PHP的session_id()函数,指定要读写的session文件,然后调用session_start()函数启动session会话,接下来就可以对session文件进行读取操作了。

  必须说明的是,PHP的Session机制并不是绝对安全的,攻击者如果能通过一定手段劫持、或者猜测出某个合法用户的sessionid,那么属于这个用户的session数据都将暴露。所以,开发者应该设计一些方案来防御攻击者的攻击,提高Session机制的安全性,下面提供了一种利用请求数据包头部中的一些字段信息来加强Session安全性的方案思路。

  将头部字段“User-Agent”和sessionid组合起来加密生成一个token,并且让客户端在后续的请求中携带这个token。为了更加保险,可使用两种不同的数据传递方式来 分别传递sessionid和token,例如,通过cookie传递sessionid,通过get方式传递token。

时间: 2024-10-26 01:59:50

PHP的Session机制的相关文章

Cookie/Session机制详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

【转载】Cookie/Session机制详解

[本文转自]http://blog.csdn.net/fangaoxin/article/details/6952954/ 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程

Session机制详解

虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答.     一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中文经常翻译为会话,

理解session机制

理解session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息. 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessio

session机制详解以及session的相关应用

session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的情况时候我们需要更加深入的理解session的机制,本文将梳理下session的相关知识,为设计可替代web容器自带的session机制打个基础. 1.1 session的概念 在计算机专业术语里:session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册入系统到注销系统之间所经过的时

JavaEE session机制

JavaEE session机制 Http协议: 在讲session之前,必须说下Http协议,HTTP是一个client和server端请求和应答的标准(TCP).由HTTPclient发起一个请求,建立一个到server指定port(默认是80port)的TCP连接.HTTPserver则在那个port监听client发送过来的请求.一旦收到请求,server(向client)发回一个状态行,比方"HTTP/1.1200 OK",和(响应的)消息,消息的消息体可能是请求的文件.错误

Session机制

一: 1.介绍 对于会话与状态管理,有两种方式,cookie与session. 其中,cookie机制采用客户端保持cookie的方案. 而,session机制采用的是服务器保持Http状态信息的方案. 2.响应方式 以cookie的方式进行实现的. 浏览器打开,对服务器进行访问,这时因为第一次进行访问,所以没有sessionId,所以服务端会新建一个HttpSession,将sessionId以set-cookie的方式将sessionId返回给浏览器,在这次会话中,浏览器进行下次访问服务端时

理解Cookie和Session机制

转自:http://my.oschina.net/xianggao/blog/395675 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie机制 Cookie技术是客户端的解决方案,Cooki

理解Cookie和Session机制(转)

目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie的有效期 Cookie的修改.删除 Cookie的域名 Cookie的路径 Cookie的安全属性 JavaScript操作Cookie 案例:永久登录 Session机制 什么是Session 实现用户登录 Session的生命周期 Session的有效期 Session的常用方法 Session