客户端浏览器和服务器之间通信使用的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.use_trans_sid=1的同时也要配置session.use_only_cookies=0,否则客户端禁用了Cookie之后即使置session.use_trans_sid=1,session还是无法使用。

  在方法二中,第一次调用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。

PHP的Session机制的更多相关文章

  1. zookeeper源码分析之六session机制

    zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...

  2. Cookie/Session机制详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  3. redis+cookies实现session机制(解决 手机浏览器不自动回传cookies导致session不可用问题)

    昨天在手机端测试自己的项目遇到如下情况. 1.在手机上(苹果qq浏览器),登陆时存在session中的图片验证码结果,一直获取不到,考虑是cookies的问题.但是其他网站有貌似可以正常使用cooki ...

  4. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  5. PHP中的SESSION机制

    [转] php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧.   c ...

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

    session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的 ...

  7. Cookie/Session机制

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  8. [转]Cookie/Session机制详解

    原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用 ...

  9. 转:理解Cookie和Session机制

    原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...

  10. SESSION机制

    一:Session与Cookie Session:在服务器端创建并存放在服务器的内存中的,Session的内容存储是键值对的列表,格式:名称 | 类型:长度:值 Session的生命周期:在php.i ...

随机推荐

  1. SAP高可用性(HA)

    1.SAP系统高可用的要求 高可用性是从终端用户的角度来需求,及要求最大化系统的可用性.其目的是降低意外系统关闭时间(服务器生效.存储失效.操作系统失败--),减少预期系统关闭时间(系统及架构的维护. ...

  2. Hibernate逆向工程【PowerDesigner、idea环境下】

    为什么要使用逆向工程 由于我们每次编写Hibernate的时候都需要写实体,写映射文件.而且Hibernate的映射文件也容易出错.而逆向工程可以帮我们自动生成实体和映射文件,这样就非常方便了. 使用 ...

  3. Spring - Bean的概念及其基础配置

    概述 bean说白了就是一个普通的java类的实例,我们在bean中写一些我们的业务逻辑,这些实例由Sping IoC容器管理着.在web工程中的spring配置文件中,我们用<bean/> ...

  4. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  5. 搬瓦工修改自带ss密码和端口

    如果是从控制面板那里直接点击安装的ss,只需要修改这两个文件: 修改端口 /root/.kiwivm-shadowsocks-port修改密码 /root/.kiwivm-shadowsocks-pa ...

  6. nodejs中http-proxy使用小结

    最近在写xmocker的工具,用于开发前期的mock数据,不可避免的用到了代理的中间件.当然,github上有关于http-proxy封装的中间件.毕竟是自己练手的项目,就自己写了个中间件,方便定制功 ...

  7. Hive基础(1)---Hive是什么

    1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案.由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性. 这是来自官方的 ...

  8. Spring Boot Document Part II(下)

    Part II. Getting started 11. 开发第一个Spirng Boot Application使用Spring Boot的关键特征开发一个基于JAVA Web的“Hello Wor ...

  9. .NET十年回顾

    一.   引子 从我还是编程菜鸟时起,.NET就从来没让我失望过.总是惊喜不断. 当年我第一个项目是做个进销存.用的Winform.当时我是机电工程师.编程只是业余心血来潮而已. .NET的低门槛.V ...

  10. ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序

    为什么写这一系列文章? 本系列文章基于ASP.NET MVC,在ASP.NET Core已经发布2.0版本,微服务漫天的今天为什么还写ASP.NET?. 答:虽然现在已经有ASP.NET Core并且 ...