PHP SameSite会话问题,会话不起作用

时间:2020-02-10 19:26:24

标签: php session cookies samesite

我希望任何人都能给我一些解决我问题的想法。我正在尝试应用SameSite cookie以使会话正常工作,但似乎不起作用。访问过的网站html:

<iframe src="https://www.example.com/test/iframe.php"></iframe>

iframe源站点:

    <?php
    header('Set-Cookie: cross-site-cookie=PHPSESSID; SameSite=None; Secure');
    session_start();
    if(!isset($_SESSION['test'])){
        echo 1;
        $_SESSION['test'] = 'ee2';
    }else{
        echo $_SESSION['test'];
    }

如果我访问该网站,我仍然在浏览器控制台中收到A cookie associated with a cross-site resource at https://www.example.com/ was set without the SameSite attribute. It has been blocked, as Chrome now only delivers cookies with cross-site requests if they are set with SameSite=None and Secure.消息,并且会话未保存。

奇怪的是,实际上已经设置了cookie: enter image description here

我错过了什么吗?如果设置了跨站点cookie,为什么在控制台中会收到此消息?会话无法工作的原因可能是什么?我正在使用php 7.1.33。如果我直接打开iframe,它会正常工作,如果我使用浏览器打开该网站(默认情况下未启用Samesite cookie标志进行测试),它也可以正常工作。

6 个答案:

答案 0 :(得分:7)

我通过编辑.htaccess解决了它

<ifmodule mod_headers.c>
Header always edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure
</ifmodule> 

答案 1 :(得分:3)

我暂时使用htaccess解决了我的问题:

Header edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure

答案 2 :(得分:3)

设置会话和Cookie参数php:https://www.php.net/manual/en/function.session-set-cookie-params.php 浏览器: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

<?php
session_set_cookie_params(["SameSite" => "Strict"]); //none, lax, strict
session_set_cookie_params(["Secure" => "true"]); //false, true
session_set_cookie_params(["HttpOnly" => "true"]); //false, true
session_start(); //everything before this

或php.ini:

[Session]
session.cookie_samesite = "Strict"
session.cookie_secure = 1
session.cookie_httponly = 1

答案 3 :(得分:1)

我为此写了一个班。

https://github.com/ovunctukenmez/SameSiteSessionStarter

它还会检查浏览器是否正确支持samesite参数。

代替session_start();
像这样使用:

<?php
require_once 'SameSiteSessionStarter.php';

//start samesite none php session
SameSiteSessionStarter::session_start();

答案 4 :(得分:1)

我通过以下方式解决了该问题:

<?php

session_start();
header('Set-Cookie: PHPSESSID= ' . session_id() . '; SameSite=None; Secure');

答案 5 :(得分:0)

我发现 this worked for me - 将 SameSite 设置为“无” - 以及有关 here 含义的更多信息。

显然,浏览器不再允许你在 iframe 中设置你想要的任何东西,我试图在 iframe 中处理一个会话,加载到不同的域上,在这样做时,我注意到正在创建一个不同的会话OTHER 域而不是我在 iframe 中加载的域。这似乎已经解决了。我仍在测试中,但这是我今天早上开始寻找修复程序以来第一件奏效的事情。