一、什么是HttpOnly

根据Jordan Wiens(国外知名安全研究员)一篇博客《No cookie for you!》记载,HttpOnly cookie最初是由Microsoft Internet Explorer开发人员于2002年在Internet Explorer 6 SP1的版本中实现。微软开发者网站介绍,HttpOnly是Set-Cookie HTTP响应头中包含的附加标志。生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险(如果浏览器支持它)。
如果HTTP响应头中包含HttpOnly标志,只要浏览器支持HttpOnly标志,客户端脚本就无法访问cookie。因此,即使存在跨站点脚本(XSS)缺陷,且用户意外访问利用此漏洞的链接,浏览器也不会向第三方透露cookie。如果浏览器不支持HttpOnly并且网站尝试设置HttpOnly cookie,浏览器会忽略HttpOnly标志,从而创建一个传统的,脚本可访问的cookie。

二、使用HttpOnly减轻最常见的XSS攻击

根据微软Secure Windows Initiative小组的高级安全项目经理Michael Howard的说法,大多数XSS攻击的目的都是盗窃cookie。服务端可以通过在它创建的cookie上设置HttpOnly标志来缓解这个问题,指出不应在客户端上访问cookie。客户端脚本代码尝试读取包含HttpOnly标志的cookie,如果浏览器支持HttpOnly,则返回一个空字符串作为结果。这样能够阻止恶意代码(通常是XSS攻击)将cookie数据发到攻击者网站。

三、通过Java设置HttpOnly

Java

自Java Enterprise Edition 6(JavaEE 6)采用Java Servlet 3.0技术以来,编程上很容易在cookie上设置HttpOnly标志。事实上,Cookie有两个方法setHttpOnly和isHttpOnly,cookie(JSESSIONID)也有。

  1. Cookie cookie = getMyCookie("myCookieName");
  2. cookie.SetHttpOnly(true);

此外,JavaEE 6开始,也可以通过配置文件WEB-INF/web.xml来配置HttpOnly

  1. <session-config>
  2. <cookie-config>
  3. <http-only>true</http-only>
  4. </cookie-config>
  5. <session-config>

C

  1. HttpCookie myCookie = new HttpCookie("myCookie");
  2. myCookie.HttpOnly = true;
  3. Response.AppendCookie(myCookie);

VB.NET

  1. Dim myCookie As HttpCookie = new HttpCookie("myCookie")
  2. myCookie.HttpOnly = True
  3. Response.AppendCookie(myCookie)


.NET 1.1

  1. Response.Cookies[cookie].Path += ";HTTPOnly";

PHP4

  1. header("Set-Cookie: hidden=value; httpOnly");

PHP5

  1. setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);

最后一个参数为HttpOnly属性


image.png

Firefox的HTTPS-only模式支持强制启用HTTPS链接


Mozilla在最新的Firefox76夜间版本中引入了一个可选的纯HTTPS模式,它只允许连接到HTTPS站点。如果一切顺利的话,Firefox可能会在一个稳定的版本中为所有用户启动这个功能。

image.png
HTTPS-only 模式启用后,Firefox 会像以前一样加载 HTTPS 站点和资源。当检测到 HTTP 站点或资源时,浏览器将尝试将其升级到 HTTPS。如果升级成功,站点或资源就会被成功加载;反之,如果无法升级,那么站点或资源则将被阻止,从而可能导致站点无法访问或部分加载。升级失败时,Firefox 还会向用户显示一条内容为“Secure Connection Failed”错误的消息 。
对于运行 Firefox 76 或更高版本的 Firefox 用户来说,可以通过以下方式在浏览器中激活新的 HTTPS-only 模式:
在浏览器的地址栏中加载 about:config 使用顶部的搜索字段搜索 dom.security.https_only_mode:将首选项设置为 TRUE 可在 Firefox 中启用 HTTPS-only 连接;将首选项设置为 FALSE 以允许所有连接(默认)。
目前,尽管大多数的站点都已经支持 HTTPS,但还是有一些站点仍旧使用 HTTP。据 Mozilla 的统计数据透露,在所有 Firefox 连接中,使用 HTTPS 的占比就只达到了 82% 左右。