专栏首页普通程序员HttpOnly是怎么回事?

HttpOnly是怎么回事?

最近配合公司安全团队开展一些工作,安全团队建议,内部系统(用户端系统有跨域需求,其他方式解决更合适)对接SSO建议开启HttpOnly。HttpOnly?没听说过,赶紧百度一下。

一、什么是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响应标头中使用的语法

如果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 Enterprise Edition 6(JavaEE 6)采用Java Servlet 3.0技术以来,编程上很容易在cookie上设置HttpOnly标志。

事实上,Cookie有两个方法setHttpOnly和isHttpOnly,cookie(JSESSIONID)也有。

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

对于JavaEE 6之前的Java Enterprise Edition版本,常见的解决方法是使用显式附加HttpOnly标志的会话cookie值覆盖SET-COOKIE HTTP响应头

粗暴覆盖并不好,因为JSESSIONID可能已经设置了其他标志。更好的解决方法是处理先前设置的标志。实际上,SecurityWrapperResponseaddCookie方法可以解决这个问题。我们可以编写一个servlet过滤器

一些实现JavaEE 5的Web应用程序服务器和实现Java Servlet 2.5(JavaEE 5的一部分)的servlet容器也允许创建HttpOnly会话cookie

例如Tomcat 6可以在context.xml文件中进行如下设置

四、用好Web应用防火墙

如果代码更改不可行或成本太高,可以使用Web应用程序防火墙将HttpOnly添加到会话cookie

Mod_security - using SecRule and Header directives

ESAPI WAF - using add-http-only-flag directive

支持HttpOnly的主流浏览器有哪些呢?谷歌了一下,常见的浏览器都支持。

本文分享自微信公众号 - 普通程序员(farmerbrag),作者:封宇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我是如何用 Webpack 虐待代码尺寸的 (第二回合)

    base64 从 css 中去掉, 直接使用外部文件, 因为本身这些文件只是一些表情, 显示的时候现加载影响也不大。

    普通程序员
  • 过早优化是万恶之源——克努特优化原则 (Knuth's optimization principle)

    我之前的工作更多集中在架构设计及性能调优方面,会更多的鼓励研发人员追求极致。最近在业务线开展工作,在这个问题上有了一些新的体会。

    普通程序员
  • 订单下单

    某天准备出远门时,想到没有充电宝,就打开京东或天猫超市,选择一个心仪的充电宝,“哎哟,居然还有一个10元的优惠券”,下单付款,下午快递员敲门,充电宝就到家了。

    普通程序员
  • 用Python任意刷新Power BI国际版

    众所周知,Power BI即便是PRO账号也仅仅提供每日8次自动刷新,但对于很多业务场景而言是远远不够的。

    陈学谦
  • vue-生命周期 源码

    生命周期的过程就是vue实例从创建到销毁的过程。在这个过程中提供了一些钩子函数用于让用户自定义一些方法。

    用户3258338
  • 从源码解读Vue生命周期,让面试官对你刮目相看

    在我们的实际项目中,与Vue的生命周期打交道可以说是家常便饭。掌握Vue的生命周期对开发者来说是特别重要的。那么如果能够从源码角度理解Vue的生命周期,对我们的...

    童欧巴
  • 腾讯云服务器标准型S3实例 企业级应用 中小型数据库系统使用

    腾讯云服务器标准型S3实例是较新一代的标准型实例,此实例提供了平衡的计算、内存和网络资源,是很多应用程序的最佳选择。选购腾讯云服务器点我领取千元代金券,付款时使...

    魏艾斯博客www.vpsss.net
  • 初探oVirt-体验sdk-python

    py3study
  • 使用Flash上传应该注意的问题。

              使用Flash上传在IE是没问题的,但是在几乎所有的非IE内核浏览器几乎都会遇到一个问题,那就是处理上传的页面或代码无法获取Cookie。不...

    雪雁-心莱科技
  • MYSQL MHA VS GTID 与 BINLOG SERVER

    勘误,昨天有一位 海外 friend 指出昨天文中 postgresql bloom 中的第四步截图是并行扫描,而没有用到bloom 索引,这里抱歉,经查实截...

    AustinDatabases

扫码关注云+社区

领取腾讯云代金券