Cookie輸出相關的安全隱患

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設置安全屬性的主要原因有如下兩類:

  1. 開發者對安全屬性毫不知情
  2. 設置安全屬性後應用無法運行

設置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腳本訪問。

學習過程中筆記的記錄與資料整理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章