我试图将我的PHP会话cookie从PHPSESSID
重命名为__Secure-PHPSESSID
,如www.example所示 www.example.com 网站上。
由于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"
这在Firefox、Edge和Safari中正常工作,但在Chrome中不行。在Chrome上,我可以看到cookie设置了正确的名称和标志,但我无法登录我的网站。
登录后,var_dump($_SESSION['internal']['user_name'])
的输出在Chrome上是NULL
,但在Firefox和其他浏览器上显示正确的用户名。我还可以看到每次尝试登录时都会重新生成会话ID,并且在__Secure-PHPSESSID
cookie中设置了该值。
我尝试删除SameSite
标志(上面第3行),但仍然不起作用。
有什么想法吗
3条答案
按热度按时间eanckbw91#
PHP确实提供了这种机制。您可以在
php.ini
中更改它。只需设置并重新启动网站:要确认它是正确的,请重新启动浏览器以清除以前的会话cookie。
至于Chrome不允许您登录,此页面可能会给予您一些线索(参见“选项安全”和“前缀”部分):https://www.mon-code.net/post/108/secure-cookie-of-you-web-application-with-php-or-symfony
它们并不广为人知,但除了微软的浏览器外,所有浏览器都支持它们。使用前缀,可以强制浏览器在配置错误时不接受cookie。有两个前缀“
__Secure-
”和“__Host-
”。__Secure-
强制开发人员将安全标志添加到他的cookie中,否则浏览器将忽略它。__Host-
的限制性更大,cookie必须具有安全标志,但也必须具有根域和空白域的路径。uwopmtnx2#
我不太熟悉Cookie Prefixes,但PHP应该支持out of the box:
uujelgoq3#
实际上,你可以使用PHP来实现它,改变
session.name
参数。你可以这样做:1.在PHP脚本中使用
session_name()
1.在
.htaccess
文件中1.直接到显示PHP选项的CPanel表中(如果您运行CPanel)
示例: