HttpOnly 标志——保护 Cookie 免受 XSS

跨站点脚本 (XSS)攻击通常旨在窃取会话 cookie。在这种攻击中,cookie 值由使用 JavaScript ( document.cookie) 的客户端脚本访问。然而,在日常使用中,Web 应用程序很少需要通过 JavaScript 访问 cookie。因此,设计了一种保护 cookie 免受此类盗窃的方法:一个标志,告诉 Web 浏览器 cookie 只能通过 HTTP 访问 - HttpOnly标志。

HttpOnly标志不是新的。它于 2002 年首次在 Microsoft Internet Explorer 6 SP1 中实施,以防止敏感信息被盗。目前,每个主流浏览器都支持HttpOnly cookie。只有一些利基移动浏览器可能会忽略此标志 -请参阅Can I Use网站上支持的浏览器的完整列表

HttpOnly 是如何工作的?

HttpOnly属性是Set-Cookie HTTP 响应标头的可选属性,由 Web 服务器在 HTTP 响应中与网页一起发送到 Web 浏览器。下面是使用Set-Cookie标头设置会话 cookie 的示例:

HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: sessionid=QmFieWxvbiA1

上面的会话 cookie 不受保护,可以在 XSS 攻击中被盗。但是,如果会话 cookie 设置如下,则可以防止使用 JavaScript 访问它:

Set-Cookie: sessionid=QmFieWxvbiA1; HttpOnly

如何设置 HttpOnly 服务器端?

所有现代后端语言和环境都支持设置HttpOnly标志。这是一个使用setcookie函数在 PHP 中执行此操作的示例:

setcookie("sessionid", "QmFieWxvbiA1", ['httponly' => true]);

最后一个值 ( true ) 表示设置HttpOnly属性。

安全 Cookie 的其他标志

HttpOnly标志不是唯一可用于保护cookie的cookie 安全标志。这里还有两个有用的。

安全标志

Secure标志用于声明 cookie 只能使用安全连接 (SSL/HTTPS) 传输。如果设置了这个 cookie,如果连接是 HTTP,浏览器将永远不会发送 cookie。此标志可防止通过中间人攻击窃取 cookie 。

请注意,此标志只能在 HTTPS 连接期间设置。如果在 HTTP 连接期间设置,浏览器将忽略它。

例子:

Set-Cookie: sessionid=QmFieWxvbiA1; HttpOnly; Secure

在 PHP 中设置上述 cookie 的示例:

setcookie("sessionid", "QmFieWxvbiA1", ['httponly' => true, 'secure' => true]);

SameSite 标志

SameSite标志用于声明 Web 浏览器何时应发送 cookie,具体取决于访问者与设置 cookie 的站点的交互方式。此标志用于帮助防止跨站点请求伪造 (CSRF)攻击。

SameSite属性可能具有以下值之一

  • SameSite=Strict:仅当您当前位​​于设置了 cookie 的站点上时才会发送 cookie。如果您在不同的站点上并单击指向设置 cookie 的站点的链接,则 cookie不会随第一个请求一起发送。
  • SameSite=Lax不会为嵌入内容发送 cookie,但如果您单击指向设置了 cookie 的站点的链接,则会发送该 cookie 它仅与不更改状态的安全请求类型一起发送,例如 GET。
  • SameSite=None:即使是嵌入的内容也会发送 cookie。

未设置SameSite属性时,默认情况下不同浏览器的行为不同。例如,在 2019 年,Google Chrome 浏览器更改了SameSite cookie的默认行为。

例子:

Set-Cookie: sessionid=QmFieWxvbiA1; HttpOnly; Secure; SameSite=Strict

在 PHP 中设置上述 cookie 的示例:

setcookie("sessionid", "QmFieWxvbiA1", ['httponly' => true, 'secure' => true, 'samesite'=>'Strict']);

Cookie 标志是否足以对抗 XSS?

尽管 cookie 标志对许多攻击有效,但它们不能用作跨站点脚本的补救措施。攻击者可能会想办法规避限制。例如,执行跨站点跟踪 (CST) 攻击,甚至窃取受HttpOnly等标志保护的 cookie 。

防止跨站点脚本的唯一有效方法是在应用程序中找到此类漏洞并从源头上消除它们。找到此类漏洞的唯一有效方法是执行手动渗透测试和/或使用自动漏洞扫描程序

猜你喜欢

转载自blog.csdn.net/allway2/article/details/126120759