如何告诉PHP对跨站点cookie使用SameSite=None?

如何告诉PHP对跨站点cookie使用SameSite=None?,php,session,cookies,session-cookies,php-7.3,Php,Session,Cookies,Session Cookies,Php 7.3,根据这篇文章和上的PHP文档,对于PHP7.3中添加的这一新功能,只有两种可能的配置选项: session.cookie\u samesite=Lax session.cookie\u samesite=严格 然而,根据Chrome控制台,这需要设置为“无”: 与URL处的跨站点资源关联的cookie设置时没有SameSite属性。它已被阻止,因为Chrome现在只提供带有跨站点请求的cookie,如果它们设置为SameSite=None和Secure。您可以在“应用程序>存储>cookies”

根据这篇文章和上的PHP文档,对于PHP7.3中添加的这一新功能,只有两种可能的配置选项:

  • session.cookie\u samesite=Lax
  • session.cookie\u samesite=严格
  • 然而,根据Chrome控制台,这需要设置为“无”:

    与URL处的跨站点资源关联的cookie设置时没有
    SameSite
    属性。它已被阻止,因为Chrome现在只提供带有跨站点请求的cookie,如果它们设置为
    SameSite=None
    Secure
    。您可以在“应用程序>存储>cookies”下的“开发人员工具”中查看cookies,并在URL和URL中查看更多详细信息

    因此,我无法再设置跨站点cookie。解决方法是什么?

    您可以使用将值设置为“无”。使用该函数时,不检查该值是否受支持:

    ini_set('session.cookie_samesite', 'None');
    session_start();
    
    也可以设置它:

    session_set_cookie_params(['samesite' => 'None']);
    session_start();
    
    php.ini中支持的错误报告是



    如会话中所述,
    cookie\u secure
    必须为
    true
    才能工作。PHP不需要它,但浏览器需要它。

    此方法对您的

    nginx
    下面的
    Secure
    +
    SameSite=None

    地点/{

    代理_cookie_path/“/;安全;SameSite=none”

    }

    这对我有好处

    坏的:

    session.cookie_samesite=None
    
    正确:

    session.cookie_samesite="None"
    

    解释

    我正在使用cakephp 1.3。我需要后端cookie在前端,这不是同一个域。 请在此详细查看

    ini\u集('session.cookie\u secure',“1”);ini_set('session.cookie_httponly',“1”);ini_set('session.cookie_samesite','None');会话_start()

    phpinfo中的PHP7.4 samesite

    phpinfo中不存在PHP7.2 samesite


    对于PHP5.6.40,存在一种解决方法(hack on path参数),它不涉及重建PHP

    如果重建PHP二进制文件没有问题,我设法将此功能从PHP7.3移植到PHP5.6.40,现在有一个pull请求。 对于我们尚未迁移的项目,我需要它。 我知道5.6分支已被弃用,我只是在分享

    拉取请求:

    我们的回购协议及其变更:

    在Debian 8.11上进行构建测试

    新功能 会议: . 添加了对setcookie()的SameSite cookie指令的支持, setrawcookie()和session_set_cookie_params()。 来自PHP7.x分支的端口 它们的最末端都有一个“samesite”附加参数(字符串)

    原型:

    bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
    bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
    void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]])
    (session_get_cookie_params updated too)
    
    对INI文件处理的更改
    • session.cookie_samesite . 新的INI选项,允许为Cookie设置SameSite指令。默认值 设置为“”(空字符串),因此未设置SameSite指令。可以设置为“Lax” 或设置相应SameSite指令的“严格”或“无”。 使用“无”时,请确保包含引号,因为
      None
      会被解释 像ini文件中的
      false

    这解决了Chrome中“此设置Cookie由于用户偏好而被阻止”的问题。

    谢谢-我能够使用以下代码删除Chrome消息并允许跨站点Cookie继续工作:会话设置Cookie参数(['samesite'=>'None','secure'=>true]);注意,旧浏览器不支持samesite=none,它将完全拒绝cookie。选中此项并确保在为会话cookie设置samesite属性时排除旧浏览器:php.ini中的setting session.cookie_samesite=None在PHP7.3.15中不起作用。如上所述使用session_set_cookie_参数确实有效。稍有错误。需要是:
    session\u set\u cookie\u参数(['SameSite'=>'None','Secure'=>true])@shrimpragon updated不能这样做。某些浏览器存在错误,将完全拒绝SameSite=None的Cookie。您需要先嗅探UserAgent。您可以在这里使用php标题进行检查。
    
    bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
    bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
    void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]])
    (session_get_cookie_params updated too)