Skip to content

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; HttpOnly
    • Set-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 窃取Cookie

    • SameSite:可选参数,控制是否在跨站请求中发送Cookie(注意:部分旧浏览器(如IE11)不支持此属性,需额外处理)

      模式行为描述适用场景
      StrictCookie仅在同站请求(相同域名)中发送,跨站请求完全不携带Cookie极高敏感操作(如银行交易)
      Lax允许部分安全的跨站请求携带Cookie(如导航链接的GET请求),大多数现代浏览器(Chrome、Firefox等)默认的设置选项大多数场景的默认推荐,平衡安全与用户体验
      None允许所有跨站请求携带Cookie,但必须同时设置secure(仅限HTTPS)极特殊场景
  • 没设置HttpOnly为什么会导致xss漏洞?攻击者通常是利用网站的xss漏洞导致用户在访问客户端时执行恶意js脚本,比如获取Cookie(document.cookie)然后发送到攻击者的服务器上,从而进行用户Cookie的窃取

  • HttpOnly没出现时,开发者是怎么解决这个问题的?

    1. 方案一:将Cookie和浏览器的user-agent进行绑定,一旦发现绑定不匹配,则认为Cookie失效。弊端:入侵者既然能获取到Cookie,也能获取到用户客户端的user-agent
    2. 方案二:将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

      yml
      server:
          servlet:
              session:
                  cookie:
                      http-only: true
                      secure: true
    • SaToken 设置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

MIT版权,未经许可禁止任何形式的转载