网络知识

Cookie中HttpOnly的介绍

背景


我们知道http协议是无状态的,也就是说,客户端和服务器进行一次http交互断开后,不保留之前的状态。比如你访问了服务器,服务器返回信息给你,当你再次访问的时候,服务器是不认识你的。这就导致有些需要登录后才能使用的功能无法使用。既然是无状态的,怎么才能让服务器记住你呢?这就引入了cookie机制。

Cookie 是一种用于在客户端和服务器之间传递数据的机制。它由服务器在 HTTP 响应中发送给客户端,并由客户端在随后的请求中将该数据回传给服务器。Cookie 通常用于存储用户的身份认证、会话状态、个性化设置等信息。

cookie机制

客户端发送登录请求后,服务器验证通过后,会生成一个字符串,保存在服务器上,这个字符串代表着你的登录状态,他记住你已经登录过了,并且把这个值传给你,浏览器会自动把cookie的值保存到本地缓存里。下次再发送请求的时候浏览器会自动带上cookie值,服务器验证完cookie的有效性后,就会去处理你的请求。这就解决了http无状态性带来的麻烦。这个就是cookie。

  • 放在本地的cookie值安全吗?

不安全,如果你本地的缓存被盗走,盗走的人发送请求的时候带上你的cookie值,骗过服务器的验证,服务器还以为是在跟你交流。相当于你的身份证被人偷走了,别人用你的身份证去实名认证,然后做些非法的操作。所以保护好身份证,以及cookie就显得尤为重要。

  • 保护cookie值的方法:HttpOnly

想要保护好cookie的信息,需要服务器和客户端浏览器的配合才能做到。服务器在生成cookie后,返回给客户端的响应中,会给cookie的参数设定一个httpOnly属性,这个属性就是告诉浏览器这个cookie是不允许别人读取的。浏览器看到这个属性后,就不会开放cookie属性内容,别人也就无法读到。

以下就是服务器返回给客户端的cookie信息

在 Web 开发中,Cookie 可以设置多种属性来增强其安全性和功能。其中一个重要的属性是 “HttpOnly”,它是一种安全标志,用于限制 Cookie 的访问权限。在设置了 HttpOnly 属性的情况下,浏览器将禁止通过 JavaScript 访问和修改 Cookie,从而有效地防止一些常见的攻击,例如跨站脚本攻击(XSS)。

浏览器支持这个属性的话,它就会把这个信息保存起来,不让别的程序去读取。这就防范了跨站脚本攻击,即XSS攻击。

一、HttpOnly的简介


HttpOnly是Cookie中一个属性,用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HttpOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头。

如果HTTP响应头中包含HttpOnly标志,只要浏览器支持HttpOnly标志,客户端脚本就无法访问cookie。因此,即使存在跨站点脚本(XSS)缺陷,且用户意外访问利用此漏洞的链接,浏览器也不会向第三方透露cookie。

如果浏览器不支持HttpOnly并且网站尝试设置HttpOnly cookie,浏览器会忽略HttpOnly标志,从而创建一个传统的,脚本可访问的cookie。

二、使用方式


语法

Set-Cookie: <cookie-name>=<cookie-value>;HttpOnly

设置样例

response.setHeader( "Set-Cookie" , "cookiename=httponlyTest;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
  例如:
//设置cookie

response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")


//设置多个cookie

response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");

response.addHeader("Set-Cookie", "timeout=30; Path=/test; HttpOnly");


//设置https的cookie

response.addHeader("Set-Cookie", "uid=112; Path=/; Secure; HttpOnly");

三、HttpOnly的用途


防范跨站脚本攻击,即XSS攻击。在生成Cookie时使用HttpOnly标志有助于减轻客户端脚本访问受保护Cookie的风险。

在现在大部分的网站中都设置HttpOnly属性,如下图所示:

四、XSS攻击概述


XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

大多数XSS攻击都是针对会话cookie的盗窃。后端服务器可以通过在其创建的cookie上设置HttpOnly标志来帮助缓解此问题,这表明该cookie在客户端上不可访问。

如果支持HttpOnly的浏览器检测到包含HttpOnly标志的cookie,并且客户端脚本代码尝试读取该cookie,则浏览器将返回一个空字符串作为结果。这会通过阻止恶意代码(通常是XSS)将数据发送到攻击者的网站来使攻击失败。

跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到了页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。

示例: 一个电子商务网站在用户完成购物车操作后,将购物车的详细信息存储在一个名为 “cart” 的 Cookie 中,并将其标记为 HttpOnly。这样,即使网站存在 XSS 漏洞,攻击者也无法通过注入恶意脚本来访问和篡改用户的购物车信息。

五、总结


既然 HttpOnly 可以防止 XSS 偷取 Cookie,为什么没有被广泛使用?

原因很简单,因为HttpOnly并不是绝对不可修改的,因为数据已经在客户端存在,总有办法读取和修改。

另外,httponly就是不再允许出现js操作cookie的场景了,但是自己也没法儿使用js操作cookie了啊。


原文链接:https://blog.csdn.net/drawlessonsfrom/article/details/122078723