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

时间:2017-12-19 16:51:41

标签: php apache google-chrome session cookies

我尝试根据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行),但它仍无效。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用PHP实际实现它,更改session.name参数。你可以这样做:

  1. 在PHP脚本中使用session_name()
  2. .htaccess档案
  3. 直接进入显示PHP选项的CPanel表(如果运行CPanel)
  4. 示例:

    // 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();

Set-Cookie

答案 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);