PHP在登录/退出时重新生成会话ID不起作用

Aus*_*ron 3 php security session sessionid

我无法让 PHPsession_regenerate_id()在我正在开发的应用程序中工作。该应用程序使用(松散的)自制 MVC 框架并通过文件重定向所有请求。.htaccessindex.php

我正在尝试在注销时重新生成会话 ID,但它无法正常工作。

这是我的注销控制器中的一些代码 - 过期变量是对会话超时的检查:

    session_regenerate_id(true);        
    if(isset($_SESSION['expired']))
    {
        $this->registry->template->expired = true;
    }

    session_unset();
    session_destroy();
Run Code Online (Sandbox Code Playgroud)

同样相关的是 index.php 文件开头的代码:

    session_cache_expire(20);
    session_start();
    session_name("TMU");
    //session_regenerate_id();
Run Code Online (Sandbox Code Playgroud)

我正在回显session_id()每个页面底部的结果,以查看它包含的内容以测试它是否已重新生成。

但是,当您注销时,会话 ID 不会更改。当您再次登录(即使使用另一个帐户)时,会话 ID 是相同的。

您会注意到 index.php 文件的第四行注释掉了 - 如果我取消注释该行,ID 似乎在每个页面上都按原样重新生成。但是,当我再次注释掉该行时,会话 ID 再次是我在索引文件中取消注释该行之前的原始 ID...

我只是想知道如何让 session_regenerate_id()工作。似乎只是没有“提交”更改后的 ID。我试过使用,session_commit()但我不明白它是如何完全工作的,当我试图破坏会话时它给了我一个错误。

PHP 5.3.10 和 Apache 2.2.21

Aus*_*ron 5

多次重温这个话题后,我想通了。有两个问题。

  1. session_regenerate_id()必须在显示任何 HTML 输出和/或发送标头之前调用。(它需要作为第一个函数之一被调用,就像session_start())。
  2. 订单很重要。session_name("TMU")需要在获得session_start()所需结果之前调用- 我之前没有发现。

基本上发生在我身上的事情是在调用session_name("TMU")之后session_start()导致它设置了两个会话 ID cookie - 两个会话 - 一个名为 TMU,另一个只是默认的 PHPSESSID。更改顺序解决了我所有的问题,并重新生成 ID/销毁旧会话现在按预期工作。

对于任何在执行此操作时遇到问题的人,我建议您回显 $_SESSION 和 $_COOKIE 数组以查看特定应用程序中发生的情况。