最近在用thinkjs写自己的博客,发现总是掉到cookie的坑,于是就好好八一八这个小甜饼,没想到居然还说很有意思的,每一个知识点都能拉出一条大鱼,想想自己之前对cookie,简直就是它认识我,我只能叫出他的名字。

我将基于我自己的理解,使用原生koa2 + mysql来简单演示一下一些cookie的处理方案,有什么出岔子的地方,希望大家友好指正

1、cookie介绍

1.1 项目中cookie的使用场景

在实际的应用场景中,Cookie被用来做得最多的一件事是保持身份认证的服务端状态。比如登录状态的判断

1.2 为什么需要cookie呢?

敲黑板,HTTP是无状态协议,他不对之前发生过的请求和响应的状态进行管理。也就是每次服务器接收到请求后,并不知道请求到底用户是谁,
是否是登录态,这样服务端就懵逼了。cookie可以解决这个问题。如图,cookie的实现过程如下(盗了个图):

  • 客户端向服务器发送HTTP Resuest
  • 服务器接收到请求,在返回的HTTP Response响应头中加入set-cookie字段以及对应的cookie值
  • 客户端接收到服务器的响应,解析出头部的set-cookie字段并将其中的cookie保存到本地
  • 下次向服务器发送请求时, 会将cookie附加在HTTP请求的头字段Cookie中
  • 服务器收到请求,判断cookie,便知道了发送请求的是客户端是谁了

我是一个jser,通过原生nodejs和浏览器调试工具看到每一个服务器和浏览器交互的细节。代码如下,欢迎交流并star:

https://github.com/LaputaGit/...

有兴趣的可以了解一下,运行一下代码,代码里面有详细的注释。

2、那么问题来了,你的cookie安全吗

首先,检测你的项目使用cookie有没有以下情况

  1. 能不能用js操作客户端cookie?
  2. 对于Cookie的域(Domain)和路径(Path)设置是如何制定策略的?为何这样划分?
  3. 在有SSL的应用中,你的Cookie是否可以在HTTP请求和HTTPS请求中通用?这一条暂时放放不介绍

我个人对于cookie的安全是这么理解的,我觉得cookie不是为安全而生的,所以没必要承担安全的责任,很多人拿cookie来做登录验证,包括我自己以前也这么搞过,而且搞得很简单。。。囧

来说一下cookie的安全性话题吧,谈到"为了cookie更安全",大概会做以下工作

  • 设置httpOnly为true,来保证客户端无法操作cookie
  • 设置secure为true
  • cookie在服务器以各种方式加密后,生成token

比如,用户发起登录 -> 服务器根据客户端的username, ip, expiration, useragent等组合信息,用可加密函数加密生成token,将此token保存到数据库,并将token写入cookie。

服务端验证流程: 客户端发来请求 -> 服务器解析出cookie中的token信息 -> 将token解密,验证客户端的username是否存在,如果存在 -> 验证token是否和数据库中的token相同,如果相同 -> 验证token的有效期expiration,如果有效 -> 验证ip是否变化,如果有效 -> 验证user agent等 …我们可以把很多的选项加入到cookie的加密中。

或者,有一些方案是把敏感信息交有后端session来保存,但是数据仍然放在cookie中,通过http传输

问题来了,不管你是通过cookie加密,或者是通过session包装敏感信息,这解决的是Cookie是可以被篡改的问题!这是个内部问题,可以发送HTTP请求的不只是浏览器,很多HTTP客户端软件,比如postman, paw等等,都可以发送任意的HTTP请求,可以设置任何头字段。 假如我们直接设置Cookie字段为authed=true并发送该HTTP请求, 服务器岂不是被欺骗了?这种攻击非常容易,Cookie是可以被篡改的!

但是,这样是不能保证数据的安全性的,基于HTTP的cookie的传输是明文的,可以通过抓包获取数据,这个是传输层所决定的。这个才是cookie不安全的决定因素,不管你cookie如何加密,一旦我劫持到你的cookie,再把这个cookie原封不动地发送到服务器,退一步来说,即使加密,有时也可以通过一些手段破解,只要符合服务器cookie验证的规则,那么这个cookie是"合法的",自然就不安全了。

未完待续。。。后续会补上相关代码示例

来聊一聊Cookie(小甜饼),及其涉及到的web安全吧相关推荐

  1. python入门指南by许半仙-推文:拯救书荒(短篇小甜饼合集)

    <你老公的腿短了> 作者:许半仙 首发:长佩 因为作者简介写了跟没写一样,所以我来讲        一下.开篇攻就出了车祸,受后来发现是攻以前的白月光回来了,攻去接他才出了车祸,然后他察觉 ...

  2. JavaEE 要懂的小事:二、图解 Cookie(小甜饼)

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  3. 小甜饼cookie之精准投放

    最常见就是,你最近在淘宝或其它一些网购网站常看跟浏览的商品,你再去其它与之无关联的网站时,会有侧边广告.弹窗广告,跟你推荐一些你前面常看到的商品的,然后在网上搜了一下.原来是 第三方公司通过加放代码窃 ...

  4. servlet学习--Cookie小应用

    Cookie是web服务器发送到浏览器的间断文本信息,以后在访问同一个web站点或域时浏览器就会毫无更改的返回该文本信息,通过让服务器读取以前发送到客户端的信息,站点就能为访问者提供许多方便,例如无需 ...

  5. 聊一聊 cookie

    我们看到的 cookie 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我自己创建了一个网站,网址为http://ppsc.sankuai.com ...

  6. 聊一聊微信小程序包内容

    本文是对上次公众号发文<微信小程序逆向源码深度揭秘> 的扩展,着重探究小程序包的主要内容构成. 先有鸡还是先有蛋?谈谈小程序包的产生与消亡 包文件结构介绍与打包规则 得出的一些结论 参考资 ...

  7. 小猿圈之学习java web需要有什么基础?

    有很多人想学java,因为java虽然已经火了多年,但是其发展前景还是很不错的,有很大一部分人选择走java web方向,那么java web应该提前掌握哪些知识呢?小猿圈加加下面说一下. 首先找准自 ...

  8. 没完没了的Cookie,读懂asp.net,asp等web编程中的cookies

    在我刚学会一点asp编程时就知道cookie了,当时照着书上的代码一通输入运行后,一切OK,就这样我自以为掌握了cookie,学javascript照样是一通代码运行成功,cookie到此为止应该是山 ...

  9. 小程序弹出层禁止列表滑动_是时候展现真正的技术了!小程序教程来了——百战Web前端课程更新05.07...

    百战程序员十大精品课程,实时更新,保持行业领先.本次更新课程Web前端第二十九阶段安心食疗-微信小程序全部7个章节及课程资料.小程序是依托微信而生的,是一种不用下载就能使用的应用,也是一项创新,经过近 ...

最新文章

  1. 2D池化IPoolingLayer
  2. Python 赋值运算符
  3. 利用栈的特性,将十进制数转换成八进制数
  4. ubuntu16.04安装mysql5.7.15
  5. 中考考试的指令广播_明天FM105.2《朝朝早精神好》推出2017广州中考日特别报道...
  6. [PPOPP 15] PoweSwitch: 基于同步异步切换的分布式大规模图处理系统 学习总结
  7. [我的证书]一证一书,当思来之不易 半分半秒,恒念学无止步
  8. 在Lucene.net实现自定义排序
  9. Gradle Build速度加快终极方法(android studio)
  10. 算法练习5---快速排序Java版
  11. 配置管理小报100329:脚本中ftp命令无法自动输入密码怎么办?
  12. 使自定义控件居中于父容器的计算公式
  13. c datatable导入mysql_《项目经验》–简单三层使用DataTable向数据库表批量导入数据—向SqlServer一张表中导入数据 | 学步园...
  14. struts拦截器+注解实现网络安全要求中的日志审计功能
  15. 【BZOJ 1047】[HAOI2007]理想的正方形
  16. Android简明开发教程十六:Button 画刷示例
  17. mp3 转c语言,c – 如何从mp3文件中提取音频数据?
  18. smile——Java机器学习引擎
  19. 经验之谈:做好淘宝客的一些经验秘籍
  20. C++算法:三种方法求最大公约数和最小公倍数

热门文章

  1. cloud foundry部署报错TypeError: can't convert Hash into String
  2. CentOS下首次使用as86汇编器
  3. 如何在Linux系统上自动执行任务
  4. 了解 Apache ActiveMQ
  5. 用RadASM 开发窗口程序
  6. Struts2中的action类
  7. Windows建立目录软连接
  8. 7、Node.js EventEmitter
  9. struts2中把action中的值传递到jsp页面的例子
  10. SPSS数据记录的选择(Select Cases)