XSS漏洞防御之HttpOnly
Cookie的定义:Cookie是由服务器创建的小量信息,将信息存储在用户计算机上的文件,Cookie分为内存Cookie和硬盘Cookie。内存Cookie储存在浏览器内存中,关闭浏览器则消失。如果是硬盘Cookie,则该Cookie在其有效期内是有效的。
Cookie限制:客户端Cookie数量最多为
300个,每个不能超过4kb,每个web站点设置的Cookie数量不能超过20个Cookie是通过http response header种到浏览器的,设置Cookie的语法为:
Set-Cookie: name=value; expires=日期; domain=example.com; path=/; secure; HttpOnlySet-Cookie:http响应头,向客户端发送Cookie
name=value:必填参数,定义Cookie的名称和值,名称和值需符合URL编码规范(如空格用%20代替)
expires:可选参数,设置Cookie的过期时间,如果缺省,则Cookie不保存在硬盘中,日期的格式使用 GMT格式日期(如expires=Wed, 21 Oct 2025 07:28:00 GMT)
domain:可选参数,确定哪些域的web服务器可以读取浏览器存储的Cookie,默认值是当前请求的域名(不包含子域名),如果显式设置domain=example.com,则Cookie对example.com及其子域名(如sub.example.com)生效
path:定义web服务器哪些路径下的页面可以获取服务器发送的Cookie,通常设置为根路径(path=/),使整个站点都可访问
secure:可选参数,表明只有为https通信协议时,浏览器才向服务器提交Cookie(语法:直接写
secure,无需值)HttpOnly:可选参数,禁止 JavaScript 通过
document.cookie访问 Cookie,防范 XSS 窃取CookieSameSite:可选参数,控制是否在跨站请求中发送Cookie(注意:部分旧浏览器(如IE11)不支持此属性,需额外处理)
模式 行为描述 适用场景 Strict Cookie仅在同站请求(相同域名)中发送,跨站请求完全不携带Cookie 极高敏感操作(如银行交易) Lax 允许部分安全的跨站请求携带Cookie(如导航链接的GET请求),大多数现代浏览器(Chrome、Firefox等)默认的设置选项 大多数场景的默认推荐,平衡安全与用户体验 None 允许所有跨站请求携带Cookie,但必须同时设置secure(仅限HTTPS) 极特殊场景
没设置HttpOnly为什么会导致xss漏洞?攻击者通常是利用网站的xss漏洞导致用户在访问客户端时执行恶意js脚本,比如获取Cookie(document.cookie)然后发送到攻击者的服务器上,从而进行用户Cookie的窃取
HttpOnly没出现时,开发者是怎么解决这个问题的?
- 方案一:将Cookie和浏览器的user-agent进行绑定,一旦发现绑定不匹配,则认为Cookie失效。弊端:入侵者既然能获取到Cookie,也能获取到用户客户端的user-agent
- 方案二:将Cookie和用户IP进行绑定,但是这种弊端会造成极差的用户体验,如家里的拨号上网就是每次拨号连接更换一个IP地址
注意:HttpOnly不能解决xss漏洞的问题,开启它只是一定程度上抵御xss盗取Cookie的行为
各种类型的框架设置HttpOnly
tomcat 7.x/8.x/9.x 设置HttpOnly和secure:在web.xml中的session-config中增加下面配置
xml<cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config>springboot 设置HttpOnly和secure
ymlserver: servlet: session: cookie: http-only: true secure: trueSaToken 设置HttpOnly和secure:使用Sa-Token会使“server.servlet.session.cookie.http-only=true”配置失效,因为sa-token框架会重写cookie,此时在sa-token的配置中增加httpOnly的相关配置
yml# Sa-Token 配置 sa-token: # Cookie 相关配置 cookie: secure: true httpOnly: true