【问题标题】:Setting cookie using header("Set-cookie") vs setcookie() function使用 header("Set-cookie") vs setcookie() 函数设置 cookie
【发布时间】:2013-06-06 21:03:58
【问题描述】:

我正在重构一些代码并发现了一些我从未见过的东西。该函数用于用户登录时设置cookie:

  function setUserCookie($name, $value) {
     $date = date("D, d M Y H:i:s",strtotime('1 January 2015')) . 'GMT';
     header("Set-Cookie: {$name}={$value}; EXPIRES{$date};");
  }

现在我已被分配重构代码,我打算使用 setcookie 函数,根据 php.net,它基本上做同样的事情。

我的问题是:两者之间有什么区别,我应该使用哪一个?

注意:这段代码是很久以前写的,所以我假设当时setcookie 不存在?

【问题讨论】:

  • 您可能会发现new Cookie($name) 很有帮助,如this standalone library 中所示。这是设置 cookie 的第三个选项。老实说,永远不要直接设置 HTTP 标头。使用内置 PHP 函数或此处引用的构造函数,以便使用自动构建的标头值设置具有正确转义值的 cookie。

标签: php cookies


【解决方案1】:

没有充分的理由不使用 setcookie。上面的代码没有正确编码名称和值,所以这至少是重构的一大好处。

【讨论】:

  • setcookie() 在 32 位系统上未通过 2038。这是嵌入式平台上的网络服务器的问题(它们不会更新)。
  • setcookie() 没有使用兼容包的 Psr-7 等效项。
【解决方案2】:

这两个函数的区别在于header()是设置HTTP头的通用函数,而setcookie()是专门设置Set-Cookie头的函数。

header() 因此采用包含完整标头的字符串,而setcookie() 采用几个特定于 cookie 的参数,然后从它们创建 Set-Cookie 标头。

【讨论】:

    【解决方案3】:

    这是一个不能使用 setcookie 的用例

    • 你在 PHP 上运行一个网站
    • 您必须设置“SameSite”cookie 属性

    您可以通过利用 setcookie 中的一个错误来实现这一点,但我不会依赖一个错误,因为它会随着时间的推移而得到修复:setcookie('samesite-test', '1', 0, '/; samesite=strict');

    或者你可以使用 PHP header 函数:header("Set-Cookie: samesite-test=1; expires=0; path=/; samesite=Strict");

    请注意,设置 samesite 属性时需要 secure 选项

    【讨论】:

    • 干得好。这正是我正在寻找我的 PHP 5.5+ 服务器的内容。感谢您的回复。
    【解决方案4】:

    一个很大的区别是,setcookie 总是设置 host_only=false 并且您无能为力。

    因此,如果出于任何原因必须设置 host_only=true,则必须使用 header 方法。据我所知。

    【讨论】:

      【解决方案5】:

      我以编程方式复制了我认为是 setCookie 的确切行为。这是我的实现,如果它对其他人有用的话。

      function setUserCookie($name, $value, $expires = 0, $path = "", $domain = "", $secure = false, $http_only = false) {
         $value = rawurlencode($value);
         date_default_timezone_set('UTC');
         $date = date("D, d-M-Y H:i:s",$expires) . ' GMT';
         $header = "Set-Cookie: {$name}={$value}";
         if($expires != 0) {
           $header .= "; expires={$date}; Max-Age=".($expires - time());
         }
         if($path != "") {
           $header .= "; path=".$path;
         }
         if($domain != "") {
           $header .= "; domain=".$domain;
         }
         if($secure) {
           $header .= "; secure";
         }
         if($http_only) {
           $header .= "; HttpOnly";
         }
         header($header, false);
      }
      

      与您的函数的区别正是与 setCookie 的区别(更多参数,如自定义过期、路径、域、安全和 httpOnly)。特别要注意“header”的第二个参数(false),这样就可以放置多个 cookie 并调用不同的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 2018-06-05
        • 2015-06-15
        • 2018-04-09
        • 2020-08-16
        相关资源
        最近更新 更多