我尝试根据https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Examples将我的PHP会话Cookie从PHPSESSID
重命名为__Secure-PHPSESSID
。
由于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设置了正确的名称和标记,但我无法登录到我的网站。
登录后,Chrome上var_dump($_SESSION['internal']['user_name'])
的输出为NULL
,但在Firefox和其他浏览器上显示正确的用户名。我还可以看到每次尝试登录时都会重新生成会话ID,并且值已在__Secure-PHPSESSID
cookie中设置。
我尝试删除SameSite
标记(上面的第3行),但它仍无效。
有什么想法吗?
答案 0 :(得分:1)
您可以使用PHP实际实现它,更改session.name
参数。你可以这样做:
session_name()
.htaccess
档案示例:
// Example way 1
session_name('Secure-PHPSESSID');
session_start();
// Example way 2
php_value session.name "Secure-PHPSESSID"
答案 1 :(得分:1)
我不熟悉Cookie Prefixes,但PHP应支持out of the box:
<?php
session_name('__Secure-PHPSESSID');
session_start();
答案 2 :(得分:0)
PHP确实提供了这种机制。您可以在php.ini
中进行更改。只需进行设置并重新启动网站即可:
session.name = __SECURE-PHPSESSID
要确认是正确的,请重新启动浏览器以清除以前的会话cookie。
至于Chrome浏览器不允许您登录,此页面可能为您提供一些线索(请参阅“选项安全”和“前缀”部分):https://www.mon-code.net/post/108/Secure-cookie-of-you-web-application-with-PHP-or-Symfony
它们不是很知名,但是除 微软。使用前缀,可以强制浏览器不要 如果配置错误,请接受Cookie。有两个前缀 “
__Secure-
”和“__Host-
”。__Secure-
强制开发人员将安全标记添加到其cookie中,否则浏览器将忽略它。
setcookie('__Secure-user_id', 10, 0, '/', 'orion.dev', true);
__Host-
更具限制性,cookie必须具有安全标志,而且还必须具有根域和空白域的路径。
setcookie('__Host-user_id', 10, 0, '/', '', true);