nginx cookie有效期讨论

每一次访问都会在浏览器生成Cookie,那么Cookie的存在对于用户来讲是好仍是坏呢?说实话,这玩意的存在确实会带来一系列的问题,有趣的是几乎每一个站点都难以离开Cookie,因为Cookie的使用因其貌似简单,而很容易被人轻视。最近在开发过程当中,审视应用中的Cookie代码,几乎只须要很小的代价就能够得到巨大的安全收益。所以写下这份笔记加深记忆。nginx

cookie的安全隐患

在实际的应用场景中,Cookie被用来作得最多的一件事是保持身份认证的服务端状态。这种保持多是基于会话Session的,也有多是持久性的。然而无论哪种,身份认证Cookie中包含的服务端票据Ticket一旦泄露,那么服务端将很难区分带有此票据的用户请求是来自于真实的用户,或者是来自恶意的***者。web

在实际案例中,形成Cookie泄露最多的途径,是经过跨站脚本(如 XSS, Cross Site Script)漏洞。者能够经过一小段JavaScript代码,偷窃到表明用户身份的重要的Cookie标识。因为跨站脚本漏洞是如此的广泛(不要觉得简单的HTML Encode 就能够避免被跨站,跨站是一门很深的学问,以致于在业界衍生出一个专用的名词:跨站师),几乎每个网站都没法避免,因此这种方式是实际中被广泛使用的一种手段。浏览器

事实上避免出现这种问题的首要秘诀就是尽全部的可能,给你的Cookie加上HttpOnly的标签。HttpOnly 的具体使用不在本文的讨论范围内。安全

Cookie 的工做原理

第一次访问网站的时候,浏览器发出请求,服务器响应请求后,会将Cookie放入到响应请求中,在浏览器第二次发请求的时候,会把Cookie带过去,服务端会辨别用户身份,固然服务器也能够修改Cookie内容.服务器

nginx cookie有效期讨论

Cookie 的生命周期

建立Cookie的时候,会给Cookie指定一个值:Expire,它就是指定Cookie的有效期,也就是Cookie的生命周期,超出设置的这个生命周期,Cookie就会被清除。若是给这个值Expire设置为0或者负值,那么这样的设置就是在关闭浏览器时,就会清除Cookie,这种方式更加安全。cookie

修改cookie有效期

一般状况下,咱们的web应用服务都会经过nginx进行发布,这个时候,咱们能够经过在nginx上面进行配置文件的修改来改变cookie的有效期,因为笔者最近在基于openrestynginx进行功能开发。正好趁此机会展开对Cookie有效期的状态测试.session

上文在Cookie的生命周期中提到为了有效期的安全性,咱们能够为Cookie设置合理的有效期。如为0或者负值,那么其效果是怎样的呢?不妨看一下dom

修改思路

利用Openrestyresty.cookie进行修改。该库是用来对OpenRestyHTTP cookie操做。能够用来为Nginx解析HTTP Cookie header,并返回Cookie中的每一个字段。好比设置name,value,httponly等属性ide

有效期为24h

这里将expires设置为有效期是一天(24h)即当前系统时间(ngx.time())加24hpost

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,
    })

效果

nginx cookie有效期讨论

在这里能够看到咱们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配置是不管如何都没法登录成功的

nginx cookie有效期讨论

有效期为当前

由于ngx.cookie_time会返回一个格式化的字符串,能够用做Cookie过时时间,咱们本身手动指定过时时间。经过这个方法能够测试上文说到的Cookie自动清除的效果

nginx 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,
    })

nginx cookie有效期讨论

指定过时时间为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,
    })

nginx cookie有效期讨论

结论

这里配置-10在现实意义上跟配置元时间是同样的,不过好处在于,不用关小黑屋啦。Cookie只在当前页面上有效,一旦关闭浏览器,这个Cookie就会被浏览器清除,此时不用再考虑安全性问题。

参考文档:

  1. Cookie 安全漫谈 https://www.infoq.cn/article/cookie-security
  2. 把cookie聊清楚 http://www.javashuo.com/article/p-raxrpqhx-gk.html
  3. 浅谈cookie安全 https://zhuanlan.zhihu.com/p/58666986
相关文章
相关标签/搜索