最近项目在漏洞扫描中出现一个安全问题,主要是针对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的风险(如果浏览器支持)
以 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标志
七、文章链接