【Ruby on Rails】cookie 中的安全属性

        写在前面:这是一篇老知识学习。自从2016年开始从事网络安全的项目,虽说工作内容大部分和应用层安全相关,反倒是很少关注的应用层技术了。今天补一下知识。

        提到的内容:

  • Rails cookie 的两个属性,secure 和 httponly
  • cookie 前缀,__Secure- 和 __Host-
  • Rails 开启 force_ssl
  • CVE-2021-41819

一、Rails 设置 cookie 属性

        通常,我会在 config 下增加 initializers/session_store.rb 文件,写入 session 的配置,并且配置上 redis 作为缓存服务器。这样浏览器只需要告诉后端一个key,session 全部在服务端读取了。当然,客户端的信息也可以全部写入到 cookie 中。

        在设置 session 属性的时候,有2个属性是本文提到的,secure 和 httponly 属性。

# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: '__Secure-id', secure: true, httponly: true

        secure属性为true时,cookie 只能通过 https 协议发送给后端。如果使用http协议请求Rails应用,会收到 ERR_SSL_PROTOCOL_ERROR 的异常响应。

        httponly属性,按照 Rails 文档解释容易产生误解,会认为和secure是2个矛盾的设置。按照RFC6265的解释,该属性可避免js脚本对其进行读取,两个属性可以同时使用。(起名很重要啊)

二、cookie 前缀

        之所以关注这个内容,是因为11月底,ruby 官网公布了2个 CVE。这个后面讲,那么cookie前缀是什么呢?

        cookie 前缀是16年提出的,目前主流浏览器都支持该属性,它有2个前缀,`__Secure-` 和 `__Host-`。

        `__Secure-` 属性需要和前面提到的 secure 属性搭配使用,否则,我们的Rails应用会收到 InvalidAuthenticityToken 异常,即便是通过 https 访问也是如此。也就是说,`__Secure-` 需要在 https 下使用。

        `__Host-` 属性对 `__Secure-` 属性扩展,且必须携带 Path 属性,不能携带 Domain 属性。

        对于两个前缀如何使用,个人认为, `__Secure-` 可用于更常用的证书加密访问,对于可以严格控制访问域的场景,可以用 `__Host-` 代替。

三、强制Rails启用证书

        这是 一个老知识点了,我们在环境中 可以开启强制证书访问,方法是 

config.force_ssl = true

        开启后,HTTP协议访问时,Rails 会响应 302 跳转。

        在搜索资料的时候,看到一个观点,认为开启证书就不需要 secure 属性了。这是个错误观点。使用证书是保障在传输过程中不数据不被窃取,而 cookie  的 secure 属性保护是防止客户端窃取。两个应对的威胁场景不同。一句话,证书要用,属性要加。

四、CVE-2021-41819 讲了什么

        41819 讲的是在调用 CGI::Cookie.parse 的时候,可以对上述的 cookie 前缀进行欺骗,进而读取特殊的 cookie 内容。当然,前提是我们可以写入的一个 cookie。

        我构建了一个简单的例子,对于 Rails 来说,它是可以区分 cookies["__Secure-id"] 和 cookies["__%53ecure-id"] 的。

图片

演示环境:ruby 2.6.6,rails 5.2.6

该演示思路由申思维同学提供,在此表示感谢。

        但是如果用以下命令对 cookie 处理,可就要小心了。

2.6.6 :004 > require 'cgi'
2.6.6 :005 > cookies = CGI::Cookie.parse("__%53ecure-id=hacked;")
 => {"__Secure-id"=>#<CGI::Cookie: "__Secure-id=hacked; path=">}

        写在后面:上次发表内容,是2015年8月14日,不用掐指一算也知道有年头没写东西了。过去的6年一直沉浸在网络安全的知识里,希望今后和大家在应用交付,WAF,软件设计,Rails上有更多的交流。顺便预告下,本次 Rubyconf china 2021 线上部分昨天已经结束了,我和其他两位讲师的话题安排在了明年春季线下进行,希望到时候和大家在上海见面。

        注:封面图片来自网络。

        朋友们,关于 Rails 应用和信息安全等内容,有哪些想了解的话题,可以私信我。微信搜索公众号:里克的自习室

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值