Cookie輸出相關(guān)的安全隱患
Cookie輸出相關(guān)問題
Cookie的使用不當(dāng):
Web應(yīng)用中需要存儲包含多個網(wǎng)頁的信息時,一般會使用PHP或Servlet容器等提供的會話管理機(jī)制。通常情況下,會話管理機(jī)制僅將會話ID保存至Cookie,而將數(shù)據(jù)本身保存在Web服務(wù)器的內(nèi)存或者文件、數(shù)據(jù)庫中。如果在Cookie中保存了不該保存的數(shù)據(jù),就有可能會產(chǎn)生安全隱患。
不該保存在Cookie中的數(shù)據(jù):
外界無法更改會話變量,而應(yīng)用的而用戶則能夠更改自己的Cookie值。因此,如果將不希望被用戶擅自更改的數(shù)據(jù)保存在Cookie中,就有可能會導(dǎo)致安全隱患。
像用戶名和權(quán)限信息等,就是不可以被用戶擅自更改的數(shù)據(jù)的代表性例子。一旦將這些信息保存在Cookie中,就有可能會出現(xiàn)用戶越權(quán)操作或者越權(quán)瀏覽等現(xiàn)象。
Cookie和會話變量對比:
Cookie會話變量易用性通過API進(jìn)行取值和賦值與普通變量的用法基本一致存儲數(shù)組或?qū)ο笮枰趹?yīng)用中轉(zhuǎn)化為字符串大多都和變量一樣可以直接賦值。容量限制有嚴(yán)格限制使用上沒有限制用戶直接查看存儲的信息容易不可能漏洞等導(dǎo)致Cookie泄露后的信息泄露情況Cookie被泄露后信息也會被泄露可以通過控制使信息不易泄露數(shù)據(jù)被用戶更改容易不可能數(shù)據(jù)被第三方更改如果有XSS或HTTP消息頭注入等漏洞就可能被更改即使有可導(dǎo)致Cookie被更改的漏洞,會話變量也無法被更改控制信息的有效性容易僅限當(dāng)前會話不同服務(wù)器之間共享信息域名相同時可能基本不可能
如上表所示,使用會話變量無法實現(xiàn)而使用Cookie可以實現(xiàn)的項目,只有控制信息有效性期限和不同服務(wù)器之間共享信息這兩點。除此以外,會話變量既安全又便利,因此,一般來說最好使用會話變量。
Cookie的輸出方法不當(dāng):
輸出Cookie時容易產(chǎn)生的安全隱患,有如下兩種。
HTTP消息頭注入漏洞(通過注入更改Cookie值)
Cookie的安全屬性設(shè)置不完善
Cookie的安全屬性設(shè)置不完善:
Cookie中有名為Secure的屬性(記為安全屬性),指定了安全屬性的Cookie僅在HTTPS傳輸?shù)那闆r下才會被瀏覽器發(fā)送至服務(wù)器。而如果Cookie沒有指定安全屬性,那么即使應(yīng)用中使用了HTTPS傳輸,Cookie也仍然有可能以明文的方式傳輸,這樣就有可能會有被監(jiān)聽的風(fēng)險。
Cookie中通常保存了會話ID等事關(guān)安全性的重要信息,因此一旦被竊聽就會直接導(dǎo)致偽裝攻擊。
為了解決Cookie的安全屬性設(shè)置不完善這一問題,最直接的對策就是設(shè)置Cookie的安全屬性。然而,有些網(wǎng)站同時使用HTTP與HTTPS兩種傳輸方式,如果在存有會話ID的Cookie中設(shè)置了安全屬性,應(yīng)用就可能會運行不正常。這種情況可以采取以下解決方法,即除了使用會話ID,再生成一個令牌作為設(shè)有安全屬性的Cookie,并在每個HTTPS頁面中確認(rèn)該令牌值。
安全隱患產(chǎn)生的原因:
Cookie的安全屬性設(shè)置不完善的直接原因就是沒有給Cookie設(shè)置安全屬性,不給Cookie設(shè)置安全屬性的主要原因有如下兩類:
開發(fā)者對安全屬性毫不知情
設(shè)置安全屬性后應(yīng)用無法運行
設(shè)置Secure屬性的方式:
在php.ini中修改如下內(nèi)容即可。
session.cookie_secure=on(激活secure屬性)
seesion.cookie_httponly=on(推薦設(shè)置)
注意:一定要重啟Apache服務(wù)器。(systemctl Restart httpd)
什么樣的應(yīng)用不能設(shè)置安全屬性:
有些Web應(yīng)用同時使用了HTTP和HTTPS,典型的例子為電子商務(wù)網(wǎng)站。多數(shù)電子商務(wù)網(wǎng)站, 用戶瀏覽商品頁面時使用HTTP傳輸,而當(dāng)用戶選擇完商品進(jìn)入支付階段時使用的是HTTPS。
同時使用這兩種方式傳輸時,為保存會話ID的Cookie設(shè)置安全屬性是非常困難的。因為設(shè)置了安全屬性后,HTTP傳輸?shù)捻撁婢蜔o法接收到Cookie中的會話ID,因此也就無法利用會話管理機(jī)制。由于使用HTTP的網(wǎng)頁為了實現(xiàn)購物車等功能需要利用會話管理機(jī)制,因此當(dāng)前很多使用HTTPS的網(wǎng)站都沒有設(shè)置Cookie的安全屬性。
解法方案:使用令牌
無法給保存的會話ID的Cookie設(shè)置安全屬性時,可以采用通過令牌來防止會話劫持的方法。將保存令牌值的Cookie設(shè)置安全屬性后,HTTP頁面與HTTPS頁面將會共享會話變量,而即使會話ID被竊聽,HTTPS頁面也能夠防止會話劫持。
使用令牌能確保安全性的原因:
即使沒有設(shè)置安全屬性的會話ID被竊聽,但只要令牌值設(shè)置了安全屬性被加密,HTTPS頁面就不會遭到會話劫持,原因如下:
服務(wù)器輸出令牌的時機(jī)只有一次,即認(rèn)證成功的時候。
令牌在HTTPS的頁面被生成(服務(wù)器–》瀏覽器)
令牌被加密后由瀏覽器發(fā)送出去(瀏覽器–》服務(wù)器)
瀏覽HTTPS的頁面必須要有令牌
換言之,令牌值在服務(wù)器和瀏覽器之間傳輸時都進(jìn)了可靠的加密,而瀏覽HTTPS頁面時需要的令牌值不可能被第三方得知,因此確保了安全性。
Cookie的其他屬性:
