`
janpoem
  • 浏览: 764 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

PHP的Session托管机制容易造成漏洞

阅读更多
以下内容针对使用PHP的session_set_save_handler的托管机制进行PHP会话管理托管的开发人员。

假定我们通过open, close, pick, dump, clear, gc六个函数对PHP的会话管理进行托管。PHP的session的gc回收机制本身没有问题,问题在于对于未进行gc回收,而又已经过时了的session。

PHP应用中,会话管理都可以依赖于传统的gc机制进行回收,然而当一个项目的并发越高,而gc回收的几率越高,对于数据库(或者IO)而言是一大负荷,所以面对并发高的站点,我们都会将gc回收的基数增加(ini_set('session.gc_divisor', xxxx);),这个也不是本文要讨论的问题重点,所以具体就不讨论了。

当尝试对会话进行托管控制,实际上一方面是为了减轻PHP会话机制本身的一些弊端(减少在$_SESSION变量中存放重要的用户信息),其次,也能帮助我们更好的掌握和管理整个系统的会话。

一个标准的设计,会话数据本身,会为其设计一个生命周期,当超过声明周期的会话,当用户的客户端再持有该session_id而发生会话处理时,则认为该session已经无效,用户当重新登录以维持与服务端的会话连接。

$sessName = "MY_APP_SID";
session_name($sessName);
session_start(); // => 此处将立刻调用刚才托管的open和pick两个函数


对于一个open函数:

function open($sessId) {
    $sess = /* 根据$sessId获取到会话数据 */;
    if ($sess->isValid()) { /* 检查会话是否有效 */
        return $anyVal;
    }
    return false;
}


open函数,就是读取该客户端持有的sessId,并且读取该会话的value值($_SESSION中的值),这中间PHP会内部将$anyVal进行session_decode()返回到$_SESSION中。

当一个会话的isValid返回false的时候,我们会需要重新生成会话id,并且通知客户端更新。PHP为我们提供了这么一个函数:session_regenerate_id(),但是何时使用这个函数,是整个问题的关键。作为服务器与客户端之间的无缝转换,关键的一步在于dump的时候,偷偷的将新生成的sessId写入记录容器(数据库,内存or I/O),然而dump函数,是作为整个PHP运行过程中的末尾部分,header已经输出,你无法重新改写header。或者简单的说,我们日常编写的PHP代码,无论篇幅大小,都是经由open -> dump这个过程中执行的,当会话机制运行到dump过程时,我们已经无可扭转。

解决此问题的落实点在于最初执行session_start的时候,session最初启动的时候,即可执行session_regenerate_id,但是需要一个全局的监控(这时候js的让人十分怀念,可是php无法做到)。

$sessName = "MY_APP_SID";
$isRegenerateId = false;
session_name($sessName);
session_start(); // => 此处将立刻调用刚才托管的open和pick两个函数
if ($isRegenerateId)
    session_regenerate_id();


而在open的函数中,则是用于通知$isRegenerateId是否变更了:

function open($sessId) 
    ....

    if ($sess->isValid()) { /* 检查会话是否有效 */
        return $anyVal;
    }
    else {
        $isRegenerateId = true;
    }
    ....


dump如何处理,这里就不再例举了,因为当执行了regenerate以后,全局的session_id都会自动的跟随变化。

不过美中不足的是,PHP的OOP的闭合特性不够强大,$isRegenerateId这么一个重要的变量,暴露在任何环境中都是极度危险的,即便使用private也是十分危险的,越是私有,越容易让代码的状态不可控(这方面让人非常羡慕Scala,一个能同时拥有val和var,你只需要声明sealed类作为一个全局的监视器,就能轻松解决此问题,可惜PHP不行)。于是可以有以下方式进行调整:

$sessName = "MY_APP_SID";
session_name($sessName);
session_start(); // => 此处将立刻调用刚才托管的open和pick两个函数
if (defined('REGENERATE_SESS_ID'))
    session_regenerate_id();


很自然的,open里面,当isValid为false时,define('REGENERATE_SESS_ID', true)即可。

最后说说,不进行regenerate的后果是什么:

首先,从会话托管的设计初衷而言,让每一个会话本身具有生命周期,就是为了避开沉重的全局回收,让session数据得以冗余而暂时存在,却又不会对该会话持有者造成太大的影响与干扰,如果强行删除会话,客户端必然需要重新登录,这也只是其中的一种情况,如果没有控制好,可能会导致同样的sessId存在多条实例,或者本应超过生命周期的会话重新被激活。当然,也许处在全局的安全性考虑,客户端的个别体验都可以忽略不计,尤其是网站应用方面而言,很少有持续维持会话生命超过十几个小时的。然而这也仅限于网站方面,对于API,或者游戏,对于会话生命周期的要求,就越发的严格。如果站在企业级应用,某些时刻,某些局部,真的是分秒必争。能做到无缝的session生命周期的传承与转换,还是十分重要的。

其次,作为一个系统而言,session往往持有着重大的用户信息,无论怎么完善的系统设计,客户端和服务器之间总需要一条红绳。在特殊应用中,session总是会持有更多特殊的数据,安全的转移,并制造适当的冗余,才能为日后的数据管理,数据回报提供更加完善准确的数据。再者,只有全面的实现设计的全部,才能总结并推演出更加完善的结构,不知道bug的存在,才是最大的风险。

分享到:
评论

相关推荐

    Cookie机制和Session机制

    ### Cookie机制和Session机制 #### 一、基本概念与背景 在现代Web应用中,为了实现用户认证、个性化设置等功能,通常需要在客户端与服务器之间维持一段时间内的状态信息。然而,HTTP协议本质上是无状态的,这意味...

    php session 会话固定漏洞

    本书详细阐述了php中的session会话固定漏洞可能引发的安全问题,叙述了php代码审计的一些tips。

    Cookie、Session机制详解.doc

    Cookie、Session机制详解 Cookie机制是Web程序中常用的技术,用来跟踪用户的整个会话。Cookie通过在客户端记录信息确定用户身份。Cookie机制可以弥补HTTP协议的无状态特性,使服务器可以从客户端获取用户信息,以便...

    cookie机制和session机制的区别

    ### Cookie机制与Session机制的区别及关系 在现代网络应用中,服务器端与客户端之间的状态保持是至关重要的,尤其是在无状态的HTTP协议下。Cookie机制与Session机制是两种常用的状态管理方式,它们各自拥有独特的...

    Cookie与Session机制

    【Cookie与Session机制】在Web开发中,会话跟踪是必不可少的技术,用于区分不同用户的操作。常见的会话跟踪手段有Cookie和Session。Cookie是通过在客户端存储信息来识别用户身份,而Session则是在服务器端存储信息来...

    山石网科防火墙session机制.xlsx

    山石网科防火墙session机制

    php session登录

    在PHP编程中,Session是一种非常重要的机制,用于在用户的不同页面请求之间保持状态。它允许开发者存储用户信息,如登录状态、购物车内容等,即使用户在网站上浏览不同的页面,也能保持这些信息的连续性。现在我们来...

    Cookie与session机制详解

    ### Cookie与Session机制详解 #### 一、Cookie与Session的概念及区别 在Web开发中,为了保持用户的状态信息,通常会用到两种技术:Cookie和Session。这两种技术都是用来跟踪用户的浏览活动,但它们的工作原理有所...

    session的跟踪机制

    ### Session的跟踪机制详解 #### 一、Session与Cookie的区别 在Web开发中,Session 和 Cookie 是两种常用的技术,用于维护客户端与服务器之间的状态信息。它们各有特点,在不同的场景下发挥着重要作用。 - **...

    cookie机制和session机制的区别.docx

    cookie 机制和 session 机制的区别 cookie 机制和 session 机制是两种常用的Web会话跟踪机制,虽然它们都可以实现会话跟踪,但它们的实现机制和应用场景却有所不同。 首先,cookie 机制是一种客户端保持状态的方案...

    session机制与cookie机制(来源于IT168)

    【标题】:“session机制与cookie机制(来源于IT168)” 【描述】:这篇文章讨论了session和cookie在Web开发中的重要角色,解释了它们如何帮助维持用户状态,并且介绍了这两种机制的基本概念。 【标签】:“session...

    cookie机制和session机制的区别.

    ### Cookie机制与Session机制的区别 #### 一、概念解析 **Cookie** 和 **Session** 是两种常见的用于在Web应用程序中维护用户状态的技术。 - **Cookie**:是一种客户端存储技术,服务器可以通过HTTP响应向客户端...

    深入浅析PHP的session反序列化漏洞问题

    PHP的Session反序列化漏洞问题,主要是因为不当的Session使用和不安全的反序列化操作,可能造成未授权访问、数据泄露甚至远程代码执行等安全风险。 首先,了解PHP的Session管理机制是非常重要的。在php.ini配置文件...

    实现session身份认证机制

    `session`身份认证机制是常用的一种方法,它用于在用户登录后维护用户的会话状态,确保用户在多个请求之间保持登录状态。在这个主题中,我们将深入探讨如何使用Node.js的Express框架以及cookie来实现session身份认证...

    PHP Session处理及应用实例.pdf

    PHP Session 处理机制是 B/S 结构的程序设计中的一种解决方案,用于保存用户的状态信息和业务运行状态。Session 是一种服务器端的机制,用于保存用户的状态信息和业务运行状态。PHP 的 Session 处理机制可以方便地...

    PHP中Session机制的研究与应用.pdf

    PHP 中 Session 机制的研究与应用 PHP 中的 Session 机制是指跟踪和识别用户的机制,用于记录用户信息。Session 是一种特定时间概念,能够存储当前浏览器窗口打开的任何窗口的用户信息。这段有始有终的一系列动作/...

    PHP的session基础

    在Web开发中,PHP的Session机制是一种非常重要的用户状态管理工具,它允许开发者在用户的浏览器会话之间存储数据,确保在不同页面间传递信息。本篇文章将深入探讨Session的工作原理以及其在实际应用中的操作。 ### ...

    详解php设置session(过期、失效、有效期)

    在PHP中,Session是一种非常重要的会话管理机制,它允许开发者在用户的不同页面请求之间保持状态。本篇文章将深入探讨如何在PHP中设置Session,包括过期、失效以及有效期的管理。 首先,让我们关注`session.save_...

    php session操作类

    在PHP编程中,Session是一种非常重要的机制,用于在用户的不同页面请求之间存储和检索数据。一个良好的Session操作类可以极大地提升代码的可维护性和安全性。本文将深入探讨标题为"php session操作类"的文件——`...

    重写session机制,将session写入数据库,建表和注释写的都很清晰,已测试

    重写session机制,默认session是以临时文件形式存储在服务器,将session写入数据库,建表和注释写的都很清晰,已测试

Global site tag (gtag.js) - Google Analytics