【发布时间】:2020-11-16 19:50:37
【问题描述】:
我今天早些时候在检查我的一些子域上的 cookie 时注意到了一些让我有点惊讶的事情。尽管我已将 PHP 设置为仅使用安全 cookie,但它们仍然可以通过 HTTP 使用。
我的根域和大部分子域都是 HTTPS。事实上,它们本质上只是 HTTPS。我没有启用 HSTS,因为我有仅 HTTP 且不支持 HTTPS 的子域。 (本质上,我的域要么是 HTTPS,要么是 HTTP,而不是两者。)在导航到这些子域时,我注意到根域设置的 cookie 显示在浏览器开发人员工具中,并且似乎是根据请求发送到服务器的。
我希望这种情况不发生,因为 a) 它不安全,b) 处理这些子域的服务器确实占用了这些 cookie,因此发送它们是一种不必要的风险,可能会危及主要应用程序.
奇怪的是我的 cookie 已经很安全了。所有的cookies都是这样设置的:
setCookie("my_cookie", $cookieValue, $expires, '/', $domain, true, true);
在我的会话管理器顶部,我还有:
session_set_cookie_params(3600, '/', '.example.com', true, true);
最后一个trues 是secure 和httpOnly。有人会认为这使它们仅支持 HTTP:
HTTPS:带有“安全”的 Cookie 将仅在 HTTPS 连接上返回 Reading cookies via HTTPS that were set using HTTP
为确保会话 cookie 仅在 HTTPS 连接上发送, 您可以在开始之前使用函数 session_set_cookie_params() 会话:https://stackoverflow.com/a/6531754/6110631
具有 Secure 属性的 cookie 仅以 通过 HTTPS 协议的加密请求,从不使用不安全的 HTTP, 因此不能轻易被中间人访问 攻击者。不安全的网站(在 URL 中带有 http:)无法设置 cookie 具有安全属性。但是,不要假设 Secure 可以防止 对 cookie 中敏感信息的所有访问;例如,它可以是 由有权访问客户端硬盘的人读取。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Secure_and_HttpOnly_cookies
但是你瞧,我在根域上设置的所有 cookie继续在我的仅HTTP 子域上可用。使用开发者工具,根域中 cookie 的任何更改都会继续反映在仅 HTTP 的子域上!
我有意将 cookie 设置为 .domain 以使其在所有子域上可用,因为它们都共享会话信息并启用 SSO(即 HTTPS 域)。但是,我认为使用 secure 标志,这仍然会阻止 cookie 在仅限 HTTP 的子域上可用。这些参数中的一个是否优先于另一个? (我认为secure 会)。
为什么这没有按预期工作?似乎因为 cookie 可用,即使我有 secure 和 httpOnly,cookie 也可能从未加密的 HTTP 连接中被盗。是 cookie 没有实际发送,但浏览器(错误地)显示它们是存在的,还是这里存在真正的安全风险?
【问题讨论】:
标签: php cookies session-cookies setcookie websecurity