使用 __Secure-/__Host- 前缀重命名 PHP 会话 cookie

rin*_*t.6 6 php apache cookies session google-chrome

我正在尝试将我的 PHP 会话 cookie 从PHPSESSID重命名__Secure-PHPSESSIDhttps://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Examples

由于 PHP 不提供这种机制,我通过 Apache 服务器配置来实现:

RequestHeader edit Cookie ^__Secure-PHPSESSID(.*)$ PHPSESSID$1
Header edit Set-Cookie ^PHPSESSID(.*)$ __Secure-PHPSESSID$1
Header edit Set-Cookie ^(.*)(?<!SameSite=Strict)(?<!SameSite=Lax)$ "$1;SameSite=Lax"
Run Code Online (Sandbox Code Playgroud)

这在 Firefox、Edge 和 Safari 中可以正常工作,但在 Chrome 中则不行。在 Chrome 上,我可以看到 cookie 设置了正确的名称和标志,但我无法登录我的网站。

var_dump($_SESSION['internal']['user_name'])登录后,在 Chrome 上显示的输出NULL,但在 Firefox 和其他浏览器上显示正确的用户名。我还可以看到,每次尝试登录时都会重新生成会话 ID,并且该值会在 cookie 中设置__Secure-PHPSESSID

我尝试删除该SameSite标志(上面第 3 行),但它仍然不起作用。

有任何想法吗?

Ste*_*n R 8

PHP 确实提供了这种机制。您可以在 中更改它php.ini。只需设置此并重新启动站点即可:

session.name = __Secure-PHPSESSID
Run Code Online (Sandbox Code Playgroud)

要确认其正确性,请重新启动浏览器以清除以前的会话 cookie。

至于 Chrome 不允许您登录,此页面可能会给您一些线索(请参阅“安全选项”和“前缀”部分):https://www.mon-code.net/post/108/secure-cookie-of -you-web-application-with-php-or-symfony

它们并不为人所知,但除 Microsoft 的浏览器外,所有浏览器都支持它们。使用前缀,如果配置错误,可以强制浏览器不接受 cookie。有两个前缀“ __Secure-”和“ __Host-”。 __Secure-强制开发人员将安全标志添加到他的 cookie 中,否则浏览器将忽略它。

setcookie('__Secure-user_id', 10, 0, '/', 'orion.dev', true);
Run Code Online (Sandbox Code Playgroud)

__Host-更具限制性,cookie 必须具有安全标志,而且还必须具有根和空白域的路径。

setcookie('__Host-user_id', 10, 0, '/', '', true);
Run Code Online (Sandbox Code Playgroud)


Álv*_*lez 4

我不熟悉Cookie 前缀,但 PHP 应该开箱即用地支持它:

<?php

session_name('__Secure-PHPSESSID');
session_start();
Run Code Online (Sandbox Code Playgroud)

设置Cookie