【问题标题】:Secure cookies available via HTTP可通过 HTTP 获得的安全 cookie
【发布时间】: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 是securehttpOnly。有人会认为这使它们仅支持 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 可用,即使我有 securehttpOnly,cookie 也可能从未加密的 HTTP 连接中被盗。是 cookie 没有实际发送,但浏览器(错误地)显示它们是存在的,还是这里存在真正的安全风险?

【问题讨论】:

    标签: php cookies session-cookies setcookie websecurity


    【解决方案1】:

    浏览器开发工具似乎在显示域上可能可用的 cookie 和在请求中实际发送的 cookie 之间进行了区分——也就是说,开发工具将显示子域的 cookie,即使它们是从未向服务器发送请求。

    以下是对根域的请求示例:

    :authority: example.com
    :method: GET
    :path: /account
    :scheme: https
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    accept-encoding: gzip, deflate, br
    accept-language: en-US,en;q=0.9
    cache-control: max-age=0
    cookie: [cookies redacted]
    dnt: 1
    referer: [redacted]
    upgrade-insecure-requests: 1
    user-agent: [redacted]
    

    下面是一个对仅 HTTP 子域的请求示例:

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: en-US,en;q=0.9
    Cache-Control: max-age=0
    Connection: keep-alive
    DNT: 1
    Host: subdomain.example.com
    If-Modified-Since: Wed, 27 May 2020 20:51:35 GMT
    If-None-Match: "6c5-5a6a760afe782-gzip"
    Upgrade-Insecure-Requests: 1
    User-Agent: [redacted]
    

    如您所见,cookie 不会随第二个请求一起发送。但是,如果您在浏览器中检查两个域上的 cookie,您可以看到浏览器显示它们:

    这可能会造成混淆,但检查请求标头会发现浏览器确实避免在不安全的请求上发送安全 cookie。

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2018-12-19
      相关资源
      最近更新 更多