PHP setcookie函数不支持httponly或安全参数

时间:2019-02-20 19:21:36

标签: php google-chrome cookies httponly hsts

我不知道为什么会这样或如何解决。

我可以运行:

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

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

为什么会这样,我该如何解决?

这是PHP 7.1

如果需要的话,可以通过https访问该网站。

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

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

有人在set-cookie标头上有任何有关HSTS预加载及其效果的信息吗?

1 个答案:

答案 0 :(得分:0)

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

  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外部设置这些属性?