【问题标题】:Which is more secure for a cookie: __Host prefix or setting the Domain?哪个对 cookie 更安全:__Host 前缀还是设置域?
【发布时间】:2020-05-24 14:12:09
【问题描述】:
它们似乎都将 cookie 锁定到域,但它们不兼容(因为使用 __Host 前缀需要未设置域)。
我还没有找到一个更好的论据。我意识到使用 Domain 属性有一些特性,比如允许子域使用 cookie,这似乎是人们在 __Host 上使用它的唯一原因。
但是在所有条件相同并假设没有子域的情况下,你能解释一下为什么一个会比另一个更好吗?
【问题讨论】:
标签:
security
cookies
https
header
domain-name
【解决方案1】:
创建 __Host- 前缀是为了解决与 cookie 相关的许多安全问题,应始终在域属性上使用。将域属性留空实际上更安全,因为这样您的 cookie 将仅发送回设置 cookie 的同一主机。这在 RFC6265 中称为 host-only 标志:
如果域属性为 [empty],则将 cookie 的 host-only 标志设置为
真的。
__Host- 前缀还可以保护您的 cookie 不被托管在您域的不同子域上的网站覆盖。这是因为它们也受到 host-only 标志的限制。
最后,未加密的连接会使您的网站容易受到中间人固定攻击。 __Host- 前缀通过不允许未加密的连接使用具有此前缀的 cookie 来解决此问题,从而阻止恶意第三方在用户从 http 重定向到 https 时注入与安全 cookie 同名的 set-cookie 标头。
如果您需要设置域或路径属性,但仍需要 __Host- 前缀提供的安全性,您可以使用 __Secure- 前缀。与 __Host- 前缀一样,带有 __Secure- 前缀的 cookie 只能从安全连接中设置。
【解决方案2】:
这是一项安全功能。如果您的网站是单个静态页面(或没有子域等),则没关系。
对于具有更大攻击面的更高级应用程序,攻击者可能能够在您的子域上执行 JS。例如,通过上传一些内容、XSS 或悬空 DNS。
当您的应用程序服务器看到 __Host- 前缀时,可以确定 cookie 是在域上设置的,而不是在受损的子域上。