nginx cookie有效期討論小結(jié)
每一次訪問都會(huì)在瀏覽器生成Cookie
,那么Cookie
的存在對(duì)于用戶來說是好還是壞呢?說實(shí)話,這玩意的存在確實(shí)會(huì)帶來一系列的問題,有趣的是幾乎每個(gè)站點(diǎn)都難以離開Cookie
,由于Cookie
的使用因其貌似簡單,而很容易被人輕視。最近在開發(fā)過程中,審視應(yīng)用中的Cookie
代碼,幾乎只需要很小的代價(jià)就可以獲得巨大的安全收益。因此寫下這份筆記加深記憶。
cookie的安全隱患
在實(shí)際的應(yīng)用場景中,Cookie
被用來做得最多的一件事是保持身份認(rèn)證的服務(wù)端狀態(tài)。這種保持可能是基于會(huì)話Session
的,也有可能是持久性的。然而不管哪一種,身份認(rèn)證Cookie
中包含的服務(wù)端票據(jù)Ticket
一旦泄露,那么服務(wù)端將很難區(qū)分帶有此票據(jù)的用戶請(qǐng)求是來自于真實(shí)的用戶,或者是來自惡意的***者。
在實(shí)際案例中,造成Cookie
泄露最多的途徑,是通過跨站腳本(如 XSS, Cross Site Script)漏洞。者可以通過一小段JavaScript
代碼,偷竊到代表用戶身份的重要的Cookie
標(biāo)識(shí)。由于跨站腳本漏洞是如此的普遍(不要以為簡單的HTML Encode
就可以避免被跨站,跨站是一門很深的學(xué)問,以至于在業(yè)界衍生出一個(gè)專用的名詞:跨站師),幾乎每一個(gè)網(wǎng)站都無法避免,所以這種方式是實(shí)際中被普遍使用的一種手段。
事實(shí)上避免出現(xiàn)這種問題的首要秘訣就是盡所有的可能,給你的Cookie
加上HttpOnly
的標(biāo)簽。HttpOnly
的具體使用不在本文的討論范圍內(nèi)。
Cookie 的工作原理
第一次訪問網(wǎng)站的時(shí)候,瀏覽器發(fā)出請(qǐng)求,服務(wù)器響應(yīng)請(qǐng)求后,會(huì)將Cookie
放入到響應(yīng)請(qǐng)求中,在瀏覽器第二次發(fā)請(qǐng)求的時(shí)候,會(huì)把Cookie
帶過去,服務(wù)端會(huì)辨別用戶身份,當(dāng)然服務(wù)器也可以修改Cookie
內(nèi)容.
Cookie 的生命周期
創(chuàng)建Cookie
的時(shí)候,會(huì)給Cookie
指定一個(gè)值:Expire
,它就是指定Cookie
的有效期,也就是Cookie
的生命周期,超出設(shè)置的這個(gè)生命周期,Cookie
就會(huì)被清除。如果給這個(gè)值Expire
設(shè)置為0
或者負(fù)值,那么這樣的設(shè)置就是在關(guān)閉瀏覽器時(shí),就會(huì)清除Cookie
,這種方式更加安全。
修改cookie有效期
通常情況下,我們的web
應(yīng)用服務(wù)都會(huì)通過nginx
進(jìn)行發(fā)布,這個(gè)時(shí)候,我們可以通過在nginx
上面進(jìn)行配置文件的修改來改變cookie
的有效期,由于筆者最近在基于openresty
對(duì)nginx
進(jìn)行功能開發(fā)。正好趁此機(jī)會(huì)展開對(duì)Cookie
有效期的狀態(tài)測試.
上文在Cookie
的生命周期中提到為了有效期的安全性,我們可以為Cookie
設(shè)置合理的有效期。如為0
或者負(fù)值,那么其效果是怎樣的呢?不妨看一下
修改思路
利用Openresty
的resty.cookie
進(jìn)行修改。該庫是用來對(duì)OpenResty
的HTTP cookie
操作??梢杂脕頌?code>Nginx解析HTTP Cookie header
,并返回Cookie
中的每個(gè)字段。比如設(shè)置name
,value
,httponly
等屬性
有效期為24h
這里將expires
設(shè)置為有效期是一天(24h)
即當(dāng)前系統(tǒng)時(shí)間(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
的有效時(shí)間為5月13號(hào)的14點(diǎn)04分,說明我們的修改配置是有效的,可以通過該參數(shù)進(jìn)行Cookie
修改,只要到達(dá)這個(gè)時(shí)間點(diǎn),該Cookie
便會(huì)失效,此時(shí)用戶需要重新登錄。
有效期為創(chuàng)世紀(jì)
這里將expires
設(shè)置為有效期是-1,這里可以觀察到cookie使用的時(shí)間的是1970年,也就是UNIX紀(jì)元的元時(shí)間
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號(hào),這個(gè)時(shí)間點(diǎn)毫無懸念的已經(jīng)過時(shí)了,當(dāng)然了,在生產(chǎn)環(huán)境中這么配置。是要被關(guān)進(jìn)小黑屋探討人生價(jià)值的,用戶遇到這樣的Cookie
配置是無論如何都無法登陸成功的
有效期為當(dāng)前
因?yàn)?code>ngx.cookie_time會(huì)返回一個(gè)格式化的字符串,可以用作Cookie
過期時(shí)間,我們自己手動(dòng)指定過期時(shí)間。通過這個(gè)方法可以測試上文說到的Cookie
自動(dòng)清除的效果
指定過期時(shí)間為-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, })
指定過期時(shí)間為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, })
結(jié)論
這里配置-1
,0
在現(xiàn)實(shí)意義上跟配置元時(shí)間是一樣的,不過好處在于,不用關(guān)小黑屋啦。Cookie
只在當(dāng)前頁面上有效,一旦關(guān)閉瀏覽器,這個(gè)Cookie
就會(huì)被瀏覽器清除,此時(shí)不用再考慮安全性問題。
參考文檔:
Cookie 安全漫談 https://www.infoq.cn/article/cookie-security
把cookie聊清楚 https://juejin.im/post/59d1f59bf265da06700b0934
淺談cookie安全 https://zhuanlan.zhihu.com/p/58666986
到此這篇關(guān)于nginx cookie有效期討論小結(jié)的文章就介紹到這了,更多相關(guān)nginx cookie有效期 內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。