通过id进行PHP会话管理

时间:2017-11-12 14:18:15

标签: php security session cookies

所以我的目标是通过会话ID管理用户,这样做

  1. 检查客户端cookie是否存在旧的会话ID,如果没有请求服务器获取新的会话ID并保存在客户端cookie中,否则获取id并请求服务器恢复具有该ID的会话。
  2. 代码:

     session_id($_POST["SESSID"]);     
     session_start();
    

    2.在每个获取用户数据的请求中使用会话ID。

    但我有两个问题:

    1. 允许客户端为服务器提供会话ID是不安全的?不会打开滥用的应用程序,人们会尝试猜测其他用户的会话ID?

    2. 服务器不会失去对哪个会话过期的控制权?只要客户端拥有旧会话ID,他们就可以永久使用它吗?

    3. 编辑:可能的解决方案: 因此,为了解决我的问题,我修改了代码,为每个会话ID设置了一个到期日期,如果旧会话ID已过期,则服务器为客户端设置一个新的,如下所示:

      session_id($_POST['SESSID']);
      session_start();
      
      if( isset($_SESSION['expires']) && $_SESSION['expires'] > time()){
        //use old session
      }else{
        session_unset();
        session_destroy();
        session_start();
        session_regenerate_id(true);
        $_SESSION['expires'] = date(strtotime("+1 hour"));
        // use new session
      }
      

1 个答案:

答案 0 :(得分:1)

此漏洞甚至有一个名称。 :)它被称为session fixation

修改

要避免会话固定和相关的会话漏洞,您应该

  • 不为匿名用户分配会话(会话占用资源)
  • 每当权限级别发生变化时,最重要的是,当用户登录时,分配一个新的会话ID(如果已经存在,则重新分配一个新的会话ID)
  • 始终在服务器上生成会话ID,永远不会从客户端获取会话ID
  • 使用内置的会话管理功能(而不是像生成自己的会话ID那样)
  • 使用合理的会话超时,包括滑动和绝对,具体取决于您的业务案例

请注意,这不是一个全面的列表,并且没有特别的顺序。