Cookie设置secure和httpOnly

8,469 阅读3分钟

最近项目在漏洞扫描中出现一个安全问题,主要是针对Cookie未设置HttpOnly属性,存在安全漏洞的风险。借机学习了一下Cookie,也希望能帮助遇到此问题的你。

一、Cookie介绍:

众说周知,Cookie 在浏览器里可以保存一些例如 tokenId 等的一些控制系统登 录状态的数据。通过 Cookie 和 Session 技术来实现记录访问者的一些基本信息, Cookie 可以翻译为“小甜品,小饼干” ,Cookie 几乎在所有的网络中都会出现,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。

有些Cookie 是有限制的,一旦超过时间限制,就会被系统删除。很多人担心Cookie 会泄露用户的一些信息。但这是多余的,Cookie 是不能通过跨域来访问的,还有一些对象是不能脱离Cookie 来实现的,比如Session。这里还有一个点,就是客户端Cookie 数量最多为300个,每个不能超过4kb, 每个web站点设置的cookie 数量不能超过20个。

二、Js 操作 Cookie

一般来说,只有服务器操作Cookie 才能保证一些必要的安全。但有时候,可能需要前端来增删改查 Cookie, 这个时候咱们的主角出现了——HttpOnly

HttpOnly是包含在Set-Cookie HTTP响应头文件中的附加标志。生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险(如果浏览器支持)

image.png

以 github为例子,初次打开时,√这个对勾表明这条记录是 HttpOnly = true 的,对于Js,你是拿不到的。我们来试一下:

document.cookie

三、限制访问Cookie

有两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和 HttpOnly 属性。

标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端。它永远不会使用不安全的 HTTP 发送(本地主机除外),这意味着中间人攻击者无法轻松访问它。不安全的站点(在 URL 中带有 http:)无法使用 Secure 属性设置 cookie。但是,Secure 不会阻止对 cookie 中敏感信息的访问。例如,有权访问客户端硬盘(或,如果未设置 HttpOnly 属性,则为 JavaScript)的人可以读取和修改它。

四、设置secure,代码如下

import Cookies from 'js-cookie';
Cookies.set(TokenKey, token, { secure: true })

js-cookie其余属性见 js-cookie github地址

五、服务端设置HTTPOnly,代码如下

response.setHeader(``"Set-Cookie"``, "cookiename=httponlyTest;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly")

六、注意

通过JavaScript创建的Cookie不能包含HttpOnly标志

image.png

七、文章链接

js-cookie github地址

HTTP Cookie - HTTP | MDN

参考文章:浅谈Js 操作Cookie,以及HttpOnly 的限制 - 知乎 (zhihu.com)