PHP Session_id会根据每个请求进行更改

PHP Session_id is changing on each request

提问人:para 提问时间:11/1/2023 最后编辑:para 更新时间:11/3/2023 访问量:65

问:

我需要帮助来修复我的 php session_id,该在每个请求上都会发生变化。

我正在使用 php8.2,这在 php8.1 上运行良好

我在这里和网络上阅读了很多关于这个问题的信息......但这并不能解决问题。

我正在使用 init_set 将会话参数设置为 cookie_lifetime、gc_maxlifetime 等......并session_set_cookie_params自定义会话,但仍然相同。

有人有想法吗?

这是我的 yaml 配置

session:
  session_name: "xxxxx_xxxx"
  idle_time: 600 # 10min idle
  cookie_lifetime: 3800 #session expires in 10min if left idle
  path: /
  domain: "localhost"
  secure: true
  httponly: true
  # cookie_httponly: 1
  # cookie_secure: 1
  # use_strict_mode: 1
  gc_maxlifetime: 1440
  gc_probability: 1

  gc_divisor: 1000
  use_cookies: 1
  globalized: false

下面是要设置的会话参数数组

public function getSessionRuntimeConfigurations(): array
{
    return [
        'session.gc_maxlifetime',
        'session.cookie_lifetime',
        // 'session.gc_divisor',
        // 'session.gc_probability',
        // 'session.use_cookies',
        // 'session.cookie_httponly',
        // 'session.cookie_secure',
        // 'session.use_strict_mode',
        // 'session.gc_probability',
        // 'session.gc_divisor',
    ];
}

这是ini_set命令

    public function iniSet(): void
{
    foreach ($this->sessionEnvironment->getSessionRuntimeConfigurations() as $option) {
        $sessionKey = str_replace('session.', '', $option);
        if ($option && array_key_exists($sessionKey, $this->sessionEnvironment->getConfig())) {
            ini_set($option, $this->sessionEnvironment->getSessionIniValues($sessionKey));
        }
    }
}

对不起,这是我开始会话的地方

public function start(): void
{
    $this->setSessionName($this->sessionEnvironment->getSessionName());
    session_set_cookie_params((int) $this->sessionEnvironment->getLifetime(), $this->sessionEnvironment->getPath(), $this->sessionEnvironment->getDomain(), $this->sessionEnvironment->isSecure(), $this->sessionEnvironment->isHttpOnly());

    $this->startSession();

    if ($this->validateSession()) {
        if (!$this->preventSessionHijack()) {
            $_SESSION = [];
            $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR'];
            $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT'];
        } elseif (rand(1, 100) <= 5) { // Give a 5% chance of the session id changing on any request
            $this->sessionRegeneration();
        }
    } else {
        // $_SESSION = array();
        // session_destroy();
        // $this->startSession(); // restart session
    }

和这里

    /**
 * Start our session if we haven't already have a php session.
 *
 * @return void
 */
public function startSession()
{
    if (session_status() == PHP_SESSION_NONE && session_id() == '') {
        session_save_path(ROOT_DIR . DS . 'session_dir');
        session_start();
    }
}

这是所有相关的地方

    public function __construct(protected SessionEnvironment $sessionEnvironment)
{
    if ($sessionEnvironment) {
        $this->sessionEnvironment = $sessionEnvironment;
    }
    $id = session_id();
    $this->iniSet();
    // Destroy any existing sessions started with session.auto_start
    if ($this->isSessionStarted()) {
        session_unset();
        session_destroy();
    }
    $this->start();
}
PHP 会话 标头

评论

2赞 KIKO Software 11/1/2023
你们会阻止会话 cookie 吗?通过向我们展示存在此问题的最简单代码,可以解决您的问题。
0赞 para 11/1/2023
是的,请如何在此处添加代码
0赞 KIKO Software 11/1/2023
我以为在PHP中大多数情况下只需session_start()就可以了?我什至没有在你的问题中发现它。
0赞 para 11/1/2023
嗨,刚刚发布了进一步的代码来启动会话
1赞 KIKO Software 11/1/2023
好吧,对不起,我不能对所有这些代码说任何明确的话。它仍然不完整,而且过于复杂。当然,在 8.1 和 8.2 之间有许多大大小小的变化,这可能会导致您的复杂代码堆栈在某个地方失败。

答: 暂无答案