Cookie輸出相關問題
Cookie的使用不當:
Web應用中需要存儲包含多個網頁的信息時,一般會使用PHP或Servlet容器等提供的會話管理機制。通常情況下,會話管理機制僅將會話ID保存至Cookie,而將數據本身保存在Web服務器的內存或者文件、數據庫中。如果在Cookie中保存了不該保存的數據,就有可能會產生安全隱患。
不該保存在Cookie中的數據:
**外界無法更改會話變量,而應用的而用戶則能夠更改自己的Cookie值。**因此,如果將不希望被用戶擅自更改的數據保存在Cookie中,就有可能會導致安全隱患。
**像用戶名和權限信息等,就是不可以被用戶擅自更改的數據的代表性例子。**一旦將這些信息保存在Cookie中,就有可能會出現用戶越權操作或者越權瀏覽等現象。
Cookie和會話變量對比:
Cookie | 會話變量 | |
---|---|---|
易用性 | 通過API進行取值和賦值 | 與普通變量的用法基本一致 |
存儲數組或對象 | 需要在應用中轉化爲字符串 | 大多都和變量一樣可以直接賦值。 |
容量限制 | 有嚴格限制 | 使用上沒有限制 |
用戶直接查看存儲的信息 | 容易 | 不可能 |
漏洞等導致Cookie泄露後的信息泄露情況 | Cookie被泄露後信息也會被泄露 | 可以通過控制使信息不易泄露 |
數據被用戶更改 | 容易 | 不可能 |
數據被第三方更改 | 如果有XSS或HTTP消息頭注入等漏洞就可能被更改 | 即使有可導致Cookie被更改的漏洞,會話變量也無法被更改 |
控制信息的有效性 | 容易 | 僅限當前會話 |
不同服務器之間共享信息 | 域名相同時可能 | 基本不可能 |
如上表所示,**使用會話變量無法實現而使用Cookie可以實現的項目,只有控制信息有效性期限和不同服務器之間共享信息這兩點。**除此以外,會話變量既安全又便利,因此,一般來說最好使用會話變量。
Cookie的輸出方法不當:
輸出Cookie時容易產生的安全隱患,有如下兩種。
- HTTP消息頭注入漏洞(通過注入更改Cookie值)
- Cookie的安全屬性設置不完善
Cookie的安全屬性設置不完善:
Cookie中有名爲Secure的屬性(記爲安全屬性),**指定了安全屬性的Cookie僅在HTTPS傳輸的情況下才會被瀏覽器發送至服務器。而如果Cookie沒有指定安全屬性,那麼即使應用中使用了HTTPS傳輸,**Cookie也仍然有可能以明文的方式傳輸,這樣就有可能會有被監聽的風險。
Cookie中通常保存了會話ID等事關安全性的重要信息,因此一旦被竊聽就會直接導致僞裝攻擊。
爲了解決Cookie的安全屬性設置不完善這一問題,最直接的對策就是設置Cookie的安全屬性。然而,有些網站同時使用HTTP與HTTPS兩種傳輸方式,如果在存有會話ID的Cookie中設置了安全屬性,應用就可能會運行不正常。這種情況可以採取以下解決方法,即除了使用會話ID,再生成一個令牌作爲設有安全屬性的Cookie,並在每個HTTPS頁面中確認該令牌值。
安全隱患產生的原因:
Cookie的安全屬性設置不完善的直接原因就是沒有給Cookie設置安全屬性,不給Cookie設置安全屬性的主要原因有如下兩類:
- 開發者對安全屬性毫不知情
- 設置安全屬性後應用無法運行
設置Secure屬性的方式:
在php.ini中修改如下內容即可。
session.cookie_secure=on(激活secure屬性)
seesion.cookie_httponly=on(推薦設置)
注意:一定要重啓Apache服務器。(systemctl Restart httpd)
什麼樣的應用不能設置安全屬性:
有些Web應用同時使用了HTTP和HTTPS,典型的例子爲電子商務網站。多數電子商務網站, 用戶瀏覽商品頁面時使用HTTP傳輸,而當用戶選擇完商品進入支付階段時使用的是HTTPS。
同時使用這兩種方式傳輸時,爲保存會話ID的Cookie設置安全屬性是非常困難的。因爲設置了安全屬性後,HTTP傳輸的頁面就無法接收到Cookie中的會話ID,因此也就無法利用會話管理機制。由於使用HTTP的網頁爲了實現購物車等功能需要利用會話管理機制,因此當前很多使用HTTPS的網站都沒有設置Cookie的安全屬性。
解法方案:使用令牌
無法給保存的會話ID的Cookie設置安全屬性時,可以採用通過令牌來防止會話劫持的方法。將保存令牌值的Cookie設置安全屬性後,HTTP頁面與HTTPS頁面將會共享會話變量,而即使會話ID被竊聽,HTTPS頁面也能夠防止會話劫持。
使用令牌能確保安全性的原因:
即使沒有設置安全屬性的會話ID被竊聽,但只要令牌值設置了安全屬性被加密,HTTPS頁面就不會遭到會話劫持,原因如下:
- 服務器輸出令牌的時機只有一次,即認證成功的時候。
- 令牌在HTTPS的頁面被生成(服務器–》瀏覽器)
- 令牌被加密後由瀏覽器發送出去(瀏覽器–》服務器)
- 瀏覽HTTPS的頁面必須要有令牌
換言之,令牌值在服務器和瀏覽器之間傳輸時都進了可靠的加密,而瀏覽HTTPS頁面時需要的令牌值不可能被第三方得知,因此確保了安全性。
Cookie的其他屬性:
屬性 | 說明 |
---|---|
NAME=VALUE | 賦予Cookie的名稱和值(必須項) |
expires=DATE | Cookie的有效期(若不明確指定則默認爲瀏覽器關閉前爲止) |
path=PATH | 將服務器上的文件目標作爲Cookie的使用對象(若不指定則默認爲文檔所在的文件目錄) |
domain=域名 | 作爲Cookie使用對象的域名(若不指定則默認爲創建Cookie的服務器域名) |
Secure | 僅在HTTPS安全通信時纔會發送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript腳本訪問。 |
學習過程中筆記的記錄與資料整理。