“PHP设置cookie”;SameSite=严格;?

“PHP设置cookie”;SameSite=严格;?,php,security,cookies,Php,Security,Cookies,我最近读到了“同一站点”属性的“RFC6265”,我看了一些文章,其中提到2016年4月,Chrome 51和Opera 39实现了“同一站点”属性 我想知道当前的PHP是否支持使用此属性创建cookie 参考: 根据,这似乎是PHP7.3的问题。投票结果显示,对cookie相关函数的更通用扩展正在实现中,php.ini文件中可能还有一个新的键 但正如Marc B所写的,您可以使用header()函数调用,我会在一些文件中使用它来包含其他初始内容。[重要更新:正如@caw在下面指出的,这

我最近读到了“同一站点”属性的“RFC6265”,我看了一些文章,其中提到2016年4月,Chrome 51和Opera 39实现了“同一站点”属性

我想知道当前的PHP是否支持使用此属性创建cookie

参考:

    • 根据,这似乎是PHP7.3的问题。投票结果显示,对cookie相关函数的更通用扩展正在实现中,php.ini文件中可能还有一个新的键


      但正如Marc B所写的,您可以使用header()函数调用,我会在一些文件中使用它来包含其他初始内容。

      [重要更新:正如@caw在下面指出的,这是一种黑客行为。现在停止使用它来避免令人不快的意外!或者至少在PHP版本检查中使用它,如
      if(PHP\u version\u ID<70300){…}else{…}
      ]

      似乎您可以滥用PHP的“setcookie”函数的“path”或“domain”参数来潜入SameSite属性,因为PHP不会转义分号:

      setcookie('samesite-test', '1', 0, '/; samesite=strict');
      
      然后PHP发送以下HTTP头:

      设置Cookie:samesite test=1;path=/;samesite=strict

      我几分钟前才发现这一点,所以请自行测试!我使用的是PHP7.1.11。

      1.For PHP>=v7.3 您可以使用
      $options
      数组设置
      samesite
      值,例如:

      setcookie($name, $value, [
          'expires' => time() + 86400,
          'path' => '/',
          'domain' => 'domain.com',
          'secure' => true,
          'httponly' => true,
          'samesite' => 'None',
      ]);
      
      samesite元素的值应为
      None
      Lax
      Strict

      阅读更多的文章

      2.对于PHP 2.1使用Apache配置设置SameSite Cookie 您可以将以下行添加到Apache配置中

      Header always edit Set-Cookie (.*) "$1; SameSite=Lax"
      
      这将使用
      SameSite=Lax
      标志更新所有cookie

      请参阅此处的更多信息:

      2.2使用Nginx配置设置SameSite cookies 同样,这也会用
      SameSite=Lax
      标志更新所有cookie

      请参阅此处的更多信息:

      2.3使用
      标题
      方法设置SameSite cookies
      正如我们所知,cookies只是HTTP请求中的一个标头,具有以下结构

      Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax
      
      因此,我们可以使用
      header
      方法设置cookie

      header("Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax");
      
      事实上,Symfony不是在等待PHP7.3,而是已经在幕后完成了

      基于,这是我用来支持php=7.3的方法:

      /**
      *在PHP7.2(当前产品)和php>=7.3(当我们到达那里时)中都支持samesite cookie标志
      *发件人:https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md 及https://stackoverflow.com/a/46971326/2308553 
      *
      *@见https://www.php.net/manual/en/function.setcookie.php
      *
      *@param string$name
      *@param字符串$value
      *@param int$expire
      *@param string$path
      *@param string$domain
      *@param bool$secure
      *@param bool$httponly
      *@param string$samesite
      *@返回无效
      */
      函数setCookieSameSite(
      字符串$name,字符串$value,
      int$expire,string$path,string$domain,
      bool$secure,bool$httponly,字符串$samesite='None'
      ):无效{
      如果(PHP_版本_ID<70300){
      setcookie($name、$value、$expire、$path.';samesite='。$samesite、$domain、$secure、$httponly);
      返回;
      }
      setcookie($name,$value[
      'expires'=>$expire,
      “路径”=>$path,
      “域”=>$domain,
      “samesite”=>$samesite,
      “安全”=>$secure,
      “httponly”=>$httponly,
      ]);
      }
      
      添加到Marty Aghajanyan的答案中(因为显然我可以回答,但还没有评论)

      在Apache中通过mod_头与PHP结合使用对我来说在Apache 2.4.29(Ubuntu)中不起作用。在查看文档()时,我注意到“始终”条件在某些情况下无法从相同的响应头池中工作。因此,以下内容对我设置SameSite参数起到了作用。(在我的例子中,我为最近的Chrome 80更新设置了None)


      文档还建议,如果您想覆盖所有的基础,您可以添加带有或不带“always”的指令,但我还没有对此进行测试。

      我编写了一个用于设置samesite cookies的类

      它适用于所有PHP版本。 它还检查浏览器是否正确支持samesite参数

      用法如下:
      //set samesite strict php cookie
      SameSiteCookieSetter::setcookie('samesite_test','testvalue', array('samesite' => 'Strict'));
      

      值得一提的是,macOS和iOS上的Safari 12不会识别SameSite属性的值None,默认值Strict

      版本13将接受“无”,但没有显式设置值,默认为“Lax”

      这里有一个很好的解释:


      有很多示例显示了如何设置此属性,但没有太多解释

      如果需要跨源发送cookie,请使用None指令退出SameSite限制。None指令要求还使用Secure属性


      SameSite
      设置为
      None
      Lax
      的示例仅适用于跨域场景。如果您的代码不是跨域的,请使用
      Strict

      在live网站上解决SameSite问题后,您可能会在为本地开发环境设置PHPSESSID方面遇到问题。特别是如果您在没有HTTPS的情况下工作,并且通过在主机文件中映射IP在本地使用真实域名

      要在Chrome上解决这个问题,首先,您必须打开Chrome标志管理页面

      chrome://flags/#same-site-by-default-cookies
      
      并将这些标志设置为禁用

      • “SameSite默认cookies”
      • “没有SameSite的Cookie必须是安全的”
      然后重启chrome

      如果您访问过HTTPS站点一次,PHPSESSID的cookie仍然无法设置,您将不会有php会话。该安全cookie将已设置。因此您需要删除
      //set samesite strict php cookie
      SameSiteCookieSetter::setcookie('samesite_test','testvalue', array('samesite' => 'Strict'));
      
      chrome://flags/#same-site-by-default-cookies
      
      if(isset($_COOKIE["PHPSESSID"])){
          header('Set-Cookie: PHPSESSID='.$_COOKIE["PHPSESSID"].'; SameSite=None');
      }