代码之家  ›  专栏  ›  技术社区  ›  joshmoto

包含samesite参数的PHP setcookie函数不起作用

  •  1
  • joshmoto  · 技术社区  · 4 年前

    在你们阅读我的问题之前,请不要否决投票或结束这个问题,我已经尝试了几乎所有我能在网上找到的东西,所以也许这是一个我没有看到的简单错误。

    我有一个完整的工作程序 setcookie()

    <?php
    
    setcookie(
      '_siteauth', 
      Crypt::encrypt(site()->password),
      time() + 86400,
      '/',
    );
    
    ?>
    

    但是一旦我尝试使用 samesite cookie从未设置的选项。。。这是个问题。

    起初,在所有在线阅读之后,我认为这可能是PHP版本冲突,但在PHP 7.3.0版之前/之后的测试中都失败了。

    读后 https://www.php.net/manual/en/function.setcookie.php

    expires path , domain , secure httponly 和 闪锌矿

    这是我的车 $_SERVER['HTTP_HOST'] 后果

    demo.local.mydomain.com
    

    下面是我所有的本地测试代码尝试,使用 $\u服务器['HTTP\u主机'] 对于域。。。

    <?php
    
    setcookie(
        '_siteauth',
        Crypt::encrypt(site()->password), 
        [
            'expires' => time() + 86400,
            'path' => '/',
            'domain' => $_SERVER['HTTP_HOST'],
            'samesite' => 'None',
            'secure' => false,
            'httponly' => false
        ]
    );
    
    ?>
    
    <?php
    
    setcookie(
        '_siteauth',
        Crypt::encrypt(site()->password),
        time() + 86400,
        '/; SameSite=none'
    );
    
    ?>
    
    <?php
    
    setcookie(
        '_siteauth',
        Crypt::encrypt(site()->password),
        [
            'expires' => time() + 86400,
            'path' => '/',
            'domain' => $_SERVER['HTTP_HOST'],
            'secure' => false,
            'httponly' => false,
            'samesite' => 'None'
        ]
    );
    
    ?>
    

    这些代码示例都没有保存 _siteauth 执行时使用cookie。

    我已经尝试过php版本的每一种变体 setcookie() 包括 闪锌矿

    我改变我以前工作的原因 这个脚本是因为chrome在2020年初改变了iframe cookie策略,默认为samesite Lax None 当设置我的cookie时。

    https://web.dev/samesite-cookies-explained/
    https://web.dev/samesite-cookie-recipes/

    如果有人能看到我哪里出了问题,帮助将是惊人的。谢谢

    1 回复  |  直到 4 年前
        1
  •  1
  •   Jonathan Rosa    4 年前

    当你把饼干放在 SameSite=None 它将被(浏览器)阻止,除非它还具有 Secure ,在代码段中省略/设置为false。

    setcookie(
        '_siteauth',
        Crypt::encrypt(site()->password), 
        [
            'expires' => time() + 86400,
            'path' => '/',
            'domain' => $_SERVER['HTTP_HOST'],
            'samesite' => 'None',
            'secure' => true,
        ]
    );
    
    推荐文章