HttpOnly 标志–保护 Cookies 免受 XSS 攻击

Andrew2020-08-24 18:03:39

HttpOnly标志–保护Cookies免受XSS攻击

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

该的HttpOnly标志不是新的。它最初于2002年在Microsoft Internet Explorer 6 SP1中实现,以防止敏感信息被盗。当前,每个主流浏览器都支持HttpOnly cookie。

HttpOnly如何工作?

HttpOnly属性是Set-Cookie HTTP响应头的一个可选属性,在HTTP响应中,web服务器将该属性与web页面一起发送到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可能仅使用安全连接来发送(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。

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

xsscookie
本作品采用《CC 协议》,转载必须注明作者和本文链接
if (search && search.length > 1 && search.charAt(0) === '?写入errcode和errmsg到divCode和divMsg中。其中errcode和errmsg都是我们可控的。只要errcode和errmsg为xss代码,即可触发xss攻击。通过阿里加载js的方式,我们可以改造我们的加载方式如下:
© 2024 WANGAN.COM 帮助网安从业者成长;关注产业发展,做网络安全忠诚卫士!