重定向后 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¶2=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] =>
)
我尝试过的事情:
- 无法通过将用户重定向到我拥有的另一个网站并将他们重定向回
process.php
来重现问题
- 再次尝试将登录
process.php
的用户重定向到 process.php
- 在另一个选项卡上,当我刷新我网站上的任何其他页面时,
PHPSESSID
又回来了。在刷新其他页面后刷新 process.php
会使 PHPSESSID
再次出现。
- 只有当支付网关将用户重定向回我的网站时才会发生这种情况。使用
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
我的网站将用户重定向到支付网关页面。用户完成付款后,他们将被重定向回我的网站收据页面 process.php
。请注意,用户从 return 重定向到 https 页面。网站 URL 完全相同,即:用户从 https://website.com/payment.php to Payment Gateway and then back to https://website.com/process.php?para1=true¶2=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] => )
我尝试过的事情:
- 无法通过将用户重定向到我拥有的另一个网站并将他们重定向回
process.php
来重现问题
- 再次尝试将登录
process.php
的用户重定向到process.php
- 在另一个选项卡上,当我刷新我网站上的任何其他页面时,
PHPSESSID
又回来了。在刷新其他页面后刷新process.php
会使PHPSESSID
再次出现。 - 只有当支付网关将用户重定向回我的网站时才会发生这种情况。使用
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