重定向后 PHPSESSID cookie 丢失

PHPSESSID cookie lost after redirect

我的网站将用户重定向到支付网关页面。用户完成付款后,他们将被重定向回我的网站收据页面 process.php。请注意,用户从 return 重定向到 https 页面。网站 URL 完全相同,即:用户从 https://website.com/payment.php to Payment Gateway and then back to https://website.com/process.php?para1=true&para2=true

重定向
session_start();
print_r($_COOKIE);
print_r($_SESSION);

我得到的是:

    Array(
        [lang] => en
        [theme] => light
        [timezone] => Asia/Baghdad
    )
    Array(
    )

我期望得到的是:

    Array(
        [lang] => en
        [theme] => light
        [timezone] => Asia/Baghdad
        [PHPSESSID] => 2b656f9120*********6fd1817316
    )
    Array(
        [nonce] => 68e56bb********f2253529e09bf3f
        [userID] => 1
        [last_error] => 
        [last_success] =>
    )

我尝试过的事情:

  1. 无法通过将用户重定向到我拥有的另一个网站并将他们重定向回 process.php
  2. 来重现问题
  3. 再次尝试将登录 process.php 的用户重定向到 process.php
  4. 在另一个选项卡上,当我刷新我网站上的任何其他页面时,PHPSESSID 又回来了。在刷新其他页面后刷新 process.php 会使 PHPSESSID 再次出现。
  5. 只有当支付网关将用户重定向回我的网站时才会发生这种情况。使用 header("Location: website.com/process.php") 从任何其他网站重定向不会重现该问题。

你的 apache 配置中有这样的东西吗?

Header edit Set-Cookie ^(.*)$ ;HttpOnly;Secure;SameSite=Strict

将 Strict 更改为 Lax 应该可以解决您的问题:

Header edit Set-Cookie ^(.*)$ ;HttpOnly;Secure;SameSite=Lax

另见 https://www.sjoerdlangkemper.nl/2016/04/14/preventing-csrf-with-samesite-cookie-attribute/

尝试更改 session_start() 的默认值:

$secure = true; // if you only want to receive the cookie over HTTPS
$httponly = true; // prevent JavaScript access to session cookie
$samesite = 'lax';

if (PHP_VERSION_ID < 70300) {
    session_set_cookie_params($maxlifetime, '/; samesite='.$samesite, $_SERVER['HTTP_HOST'], $secure, $httponly);
} else {
    session_set_cookie_params([
        'lifetime' => $maxlifetime,
        'path' => '/',
        'domain' => $_SERVER['HTTP_HOST'],
        'secure' => $secure,
        'httponly' => $httponly,
        'samesite' => $samesite
    ]);
}

另见 https://www.php.net/manual/de/function.session-set-cookie-params.php#125072