【问题标题】:PHP setcookie function not honoring httponly or secure argumentsPHP setcookie 函数不支持 httponly 或安全参数
【发布时间】:2019-02-20 19:21:35
【问题描述】:

我不知道为什么会发生这种情况或如何解决它。

我可以运行这个:

setcookie('cookie_name', 1, time()+86400*365*2, "/", ".domain.com", false, false);

当我加载脚本时,我在响应头中得到了这个:

cookie_name=1; expires=Fri, 19-Feb-2021 19:08:57 GMT; Max-Age=63072000; path=/; domain=.domain.com;HttpOnly;Secure

如您所见,即使我明确告诉它不要使用这些标志,它也会强制使用 httponly 和安全标志。

为什么会发生这种情况,我该如何解决?

这是 PHP 7.1

如果这很重要,则通过 https 访问该网站。

编辑: 我们在 .htaccess 文件中使用 Strict-Transport-Security 标头。我尝试将其注释掉,但似乎没有任何效果。

编辑2: 我可以通过在 javascript 中设置 cookie 来解决这个问题。这使我无法阅读我需要的 cookie javascript。这个域在 HSTS 预加载列表中,所以我感觉 chrome 正在添加这个标志,因为它知道这个域是安全的。我不确定为什么它允许 javascript 将它们设置为未修改。

如果set-cookie 标头上有任何关于 HSTS 预加载及其影响的信息,是否有人知道?

【问题讨论】:

  • 您想对 HSTS 网站上的不安全 cookie 做什么?至少在第一次访问之后,这基本上是一个矛盾。
  • 因为我需要检查 javascript 中的 cookie,如果 cookie 仅是 HTTP,则您无法读取脚本语言中的 cookie。它与安全无关,它只是用户先前执行过一项功能的指标。我认为它可以以不同的方式处理,但这真的没关系,不值得付出额外的努力。我宁愿知道这是如何工作的或问题是什么。
  • 是的,我理解“仅 HTTP”标志;这是困扰我的“安全”。无论如何,您是否尝试过更改session.cookie_httponly 配置选项?出于某种原因,也许它优先。

标签: php google-chrome cookies httponly hsts


【解决方案1】:

我认为有趣的是最后两个标志的分号周围没有空格。这表明了以下三个原因之一:

  1. 这是您在创建问题时犯的一个不重要的错字。
  2. PHP 很奇怪。我不使用它,所以没有超出可能性范围。
  3. PHP 之外的其他东西正在设置这些属性。

I created a way of forcing these flags in Apache even if the backend process creating the cookies didn’t set them 使用这个 Apache 配置:

# Rewrite any session cookies to make them more secure
# Make ALL cookies created by this server are HttpOnly and Secure
# (except the SPECIAL-CLIENT cookie and OTHER-COOKIE which can't be HttpOnly and is already set to Secure)  
Header edit Set-Cookie ^((?!(SPECIAL-CLIENT|OTHER-COOKIE).*)$ $1;HttpOnly;Secure
#Strip off double Secure or HttpOnly settings as if App and Apache sets above you can sometimes get both
Header edit Set-Cookie ^(.*);\s?Secure;?\s?(.*);\s?Secure;?\s?(.*)$ "$1; $2; $3; Secure"
Header edit Set-Cookie ^(.*);\s?HttpOnly;?\s?(.*);\s?HttpOnly;?\s?(.*)$ "$1; $2; $3; HttpOnly"
#Strip off double ;; settings
Header edit Set-Cookie ^(.*);\s?;\s?(.*)$ "$1; $2"

您是否有可能使用类似或类似的东西在 PHP 之外设置这些属性?

【讨论】:

  • 除非 apache 在我不知情的情况下这样做,否则我对此表示怀疑。我觉得chrome正在这样做。我还没有检查 curl 中的标题,但是当我有时间时,这将是我的下一个测试。 (由于 HSTS 预加载的铬)
  • PS,这不是错字,这正是它来自 chrome 检查器的方式。
  • 是的 curl 会证明这一点,但我真的怀疑它是 Chrome。检查您的 Apache 配置,看看是否有人添加了与上述类似的内容。
猜你喜欢
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2012-01-08
  • 2016-08-21
  • 2012-03-03
相关资源
最近更新 更多