每一次访问都会在浏览器生成Cookie
,那么Cookie
的存在对于用户来说是好还是坏呢?说实话,这玩意的存在确实会带来一系列的问题,有趣的是几乎每个站点都难以离开Cookie
,由于Cookie
的使用因其貌似简单,而很容易被人轻视。最近在开发过程中,审视应用中的Cookie
代码,几乎只需要很小的代价就可以获得巨大的安全收益。因此写下这份笔记加深记忆。
cookie的安全隐患
在实际的应用场景中,Cookie
被用来做得最多的一件事是保持身份认证的服务端状态。这种保持可能是基于会话Session
的,也有可能是持久性的。然而不管哪一种,身份认证Cookie
中包含的服务端票据Ticket
一旦泄露,那么服务端将很难区分带有此票据的用户请求是来自于真实的用户,或者是来自恶意的***者。
在实际案例中,造成Cookie
泄露最多的途径,是通过跨站脚本(如 XSS, Cross Site Script)漏洞。者可以通过一小段JavaScript
代码,偷窃到代表用户身份的重要的Cookie
标识。由于跨站脚本漏洞是如此的普遍(不要以为简单的HTML Encode
就可以避免被跨站,跨站是一门很深的学问,以至于在业界衍生出一个专用的名词:跨站师),几乎每一个网站都无法避免,所以这种方式是实际中被普遍使用的一种手段。
事实上避免出现这种问题的首要秘诀就是尽所有的可能,给你的Cookie
加上HttpOnly
的标签。HttpOnly
的具体使用不在本文的讨论范围内。
Cookie 的工作原理
第一次访问网站的时候,浏览器发出请求,服务器响应请求后,会将Cookie
放入到响应请求中,在浏览器第二次发请求的时候,会把Cookie
带过去,服务端会辨别用户身份,当然服务器也可以修改Cookie
内容.
Cookie 的生命周期
创建Cookie
的时候,会给Cookie
指定一个值:Expire
,它就是指定Cookie
的有效期,也就是Cookie
的生命周期,超出设置的这个生命周期,Cookie
就会被清除。如果给这个值Expire
设置为0
或者负值,那么这样的设置就是在关闭浏览器时,就会清除Cookie
,这种方式更加安全。
修改cookie有效期
通常情况下,我们的web
应用服务都会通过nginx
进行发布,这个时候,我们可以通过在nginx
上面进行配置文件的修改来改变cookie
的有效期,由于笔者最近在基于openresty
对nginx
进行功能开发。正好趁此机会展开对Cookie
有效期的状态测试.
上文在Cookie
的生命周期中提到为了有效期的安全性,我们可以为Cookie
设置合理的有效期。如为0
或者负值,那么其效果是怎样的呢?不妨看一下
修改思路
利用Openresty
的resty.cookie
进行修改。该库是用来对OpenResty
的HTTP cookie
操作。可以用来为Nginx
解析HTTP Cookie header
,并返回Cookie
中的每个字段。比如设置name
,value
,httponly
等属性
有效期为24h
这里将expires
设置为有效期是一天(24h)
即当前系统时间(ngx.time())
加24h
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = ngx.cookie_time(ngx.time() + 60 * 60 * 24), domain = ngx.host, })
效果
在这里可以看到我们cookie
的有效时间为5月13号的14点04分,说明我们的修改配置是有效的,可以通过该参数进行Cookie
修改,只要到达这个时间点,该Cookie
便会失效,此时用户需要重新登录。
有效期为创世纪
这里将expires
设置为有效期是-1,这里可以观察到cookie使用的时间的是1970年,也就是UNIX纪元的元时间
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = ngx.cookie_time(-1), domain = ngx.host, })
从下图中可以看到Cookie
有效期是1970年1月1号,这个时间点毫无悬念的已经过时了,当然了,在生产环境中这么配置。是要被关进小黑屋探讨人生价值的,用户遇到这样的Cookie
配置是无论如何都无法登陆成功的
有效期为当前
因为ngx.cookie_time
会返回一个格式化的字符串,可以用作Cookie
过期时间,我们自己手动指定过期时间。通过这个方法可以测试上文说到的Cookie
自动清除的效果
指定过期时间为-1
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = -1, domain = ngx.host, })
指定过期时间为0
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = 0, domain = ngx.host, })
结论
这里配置-1
,0
在现实意义上跟配置元时间是一样的,不过好处在于,不用关小黑屋啦。Cookie
只在当前页面上有效,一旦关闭浏览器,这个Cookie
就会被浏览器清除,此时不用再考虑安全性问题。
参考文档:
Cookie 安全漫谈 https://www.infoq.cn/article/cookie-security
把cookie聊清楚 https://juejin.im/post/59d1f59bf265da06700b0934
浅谈cookie安全 https://zhuanlan.zhihu.com/p/58666986
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。