【问题标题】:PHP SameSite session problem, session doesn't workPHP SameSite 会话问题,会话不起作用
【发布时间】:2020-05-26 03:59:06
【问题描述】:

我希望任何人都可以给我一些想法来解决我的问题。我正在尝试应用 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实际上已经设置好了:

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

【问题讨论】:

  • $_SESSION['test'] 值是多少?你设置一个cookie而不是会话。
  • 是的,但我猜由于 PHPSESSID cookie,会话似乎不起作用。该值将始终为空,即使我刷新页面,值也不会存储到 $_SESSION['test'] 中。但如果我直接打开 iframe,它将存储值 'ee2'。
  • 首先,调用,设置sessioncookie,然后再检查session是否设置

标签: php session cookies samesite


【解决方案1】:

我通过编辑 .htaccess 解决了这个问题

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

【讨论】:

  • 请注意,这会破坏 Apple Safari 12.x 和更早版本的错误,它会将 SameSite=None 错误地解释为 SameSite=Strict。这些浏览器要求Set-Cookie 行不提及SameSite 以获得SameSite=None 的行为。
【解决方案2】:

设置会话和 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

【讨论】:

  • 这是答案,但请记住,将SecureHttpOnly 设置为anything,包括false,将在cookie 中启用它。要关闭这些属性中的任何一个,不要将它们设置为任何值,也就是说,不要在它们上调用session_set_cookie_params
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我通过以下方式解决了它:

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

    【讨论】:

    • 请恢复您的问题,以便该线程对未来的读者仍然有用。他们可能会遇到与您相同的问题。
    【解决方案5】:

    我为此写了一个类。

    https://github.com/ovunctukenmez/SameSiteSessionStarter

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

    而不是 session_start();
    像这样使用:

    <?php
    require_once 'SameSiteSessionStarter.php';
    
    //start samesite none php session
    SameSiteSessionStarter::session_start();
    

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 2014-02-08
        • 1970-01-01
        • 2010-11-24
        相关资源
        最近更新 更多