SESSION機(jī)制及其安全管理

來自Vett的博客

很多關(guān)于PHP的書都會(huì)介紹SESSION機(jī)制.但是往往介紹如何去使用,很少提及SESSION安全性雷區(qū),如何正確的使用SESSION?

SESSION機(jī)制

為什么要有SESSION機(jī)制?

因?yàn)?HTTP協(xié)議是無狀態(tài)的,SESSION是用于維持訪問狀態(tài),區(qū)分訪問者的機(jī)制.比如在沒有SESSION機(jī)制的前提下,想讓服務(wù)器完成每個(gè)訪問者的個(gè)性化定制是不可能是事情.你可能會(huì)想到使用IP和UA等信息區(qū)分客戶,但是在局域網(wǎng)通過網(wǎng)關(guān)連接廣域網(wǎng)的時(shí)候就不能起作用,而且一旦涉及到登錄等敏感操作的時(shí)候需要更加穩(wěn)定,難以偽造的用戶區(qū)分機(jī)制,這樣就有了SESSION.

什么是SESSION機(jī)制?

SESSION是將用戶信息存儲(chǔ)在服務(wù)器上,并通過Cookie或URL傳遞一個(gè)SessionID給用戶,與該用戶的信息一一對(duì)應(yīng)的機(jī)制.用戶通過傳遞SessionID向服務(wù)器表明自己的身份.服務(wù)器通過傳來的SessionID,確定用戶的狀態(tài).

表面上看,SESSION是非常巧妙的安全的設(shè)計(jì),它使得HTTP可以維持狀態(tài),在用戶體驗(yàn)上得分不少.但是,不正確的使用SESSION會(huì)使得網(wǎng)站安全岌岌可危,甚至造成不可挽回的失誤.

SESSION安全

由于SessionID就像一把鑰匙,獲取了這把鑰匙,就獲取了用戶數(shù)據(jù).所以,SESSION的攻擊就集中在如何獲取SessionID上.基本上可以分為兩種情況:

  1. 截獲SessionID
  2. 誘導(dǎo)持有SessionID的用戶執(zhí)行特定操作

截獲SessionID只能作用于設(shè)計(jì)不良的網(wǎng)站上,或者瀏覽器安全性存在巨大隱患的場(chǎng)景中.第二條是CSRF攻擊的基礎(chǔ).基本上對(duì)于SESSION低成本的攻擊都可以歸類為這兩種.

值得注意的是CSRF攻擊的預(yù)防,不能僅僅止步于對(duì)SESSION的管理上,而是要通過表單中插入Token等,只是CSRF攻擊以SESSION機(jī)制作為其根本.

PHP中SESSION的安全性

以下是常見的幾種攻擊和防范方法:

1. 關(guān)閉session.use_trans_sid

session.use_trans_sid: 在沒有開啟cookie的網(wǎng)站上允許通過URL傳遞SessionID.

開啟這項(xiàng)配置,攻擊者可以通過迷惑用戶使用帶有SessionID的的URL訪問目標(biāo)網(wǎng)站,之后用戶在此SessionID下留有的信息,對(duì)于攻擊者都是可見的.

在關(guān)閉這項(xiàng)配置的時(shí)候也可以使用JavaScript讀取用戶cookie中的SessionID.

例如:
A網(wǎng)站存在上述缺陷,小明點(diǎn)擊黑客提供的鏈接a.com/?ssid=aabbcc訪問了網(wǎng)站A,并在該網(wǎng)站登錄,然后退出.這時(shí)黑客在使用鏈接a.com/?ssid=aabbcc登錄后發(fā)現(xiàn)正處于登錄狀態(tài),然后進(jìn)行非法操作.

如果a.com網(wǎng)站關(guān)閉session.use_trans_sid配置,這樣小明就無法登錄,因?yàn)榻昧薱ookie.這樣雖然對(duì)用戶體驗(yàn)很不友好,但是絕大多數(shù)成熟網(wǎng)站都是這樣做的.更進(jìn)一步,應(yīng)該開啟session.use_strict_mode防止類似aabbcc這種未初始化的SessionID被使用,但是黑客可以將aabbcc改為a.com正常生成的SessionID,雖然作用有限,但是強(qiáng)烈建議開啟這個(gè)配置.

假設(shè)a.com關(guān)閉了session.use_trans_sid配置,小明也可以正常接收cookie,那么攻擊還會(huì)發(fā)生嗎?

2. 開啟session.cookie_httponly

網(wǎng)站a.com強(qiáng)制要求用戶使用cookie來接收SessionID.

這時(shí)黑客升級(jí)了自己的攻擊方案,在a.com通過XSS,在小明經(jīng)常訪問的頁面評(píng)論區(qū)注入了JavaScript腳本用來直接獲取小明瀏覽器中的cookie數(shù)據(jù).雖然攻擊難度加大,但是小明會(huì)在毫不知情的情況下暴露SessionID.

網(wǎng)站a.com只要對(duì)用戶的評(píng)論信息做轉(zhuǎn)義就可以有效的防止XSS注入.這不屬于SESSION安全的范疇,但是的確可以通過這種方法保護(hù)SessionID.最主要的是開啟session.cookie_httponly,杜絕使用JavaScript讀取cookie.但是這個(gè)設(shè)置有個(gè)前提,就是用戶使用高質(zhì)量的瀏覽器,因?yàn)檫@個(gè)設(shè)置只能起到通知瀏覽器的作用,具體邏輯是由瀏覽器實(shí)現(xiàn)的.

3.在表單中使用Token

網(wǎng)站a.com做了XSS防范,并且開啟了session.cookie_httponly.

黑客繼續(xù)升級(jí)自己的攻擊方案,在自己的網(wǎng)站上使用JavaScript惡意向目標(biāo)網(wǎng)站a.com提交表單,一旦小明開始向a.com提交,a.com索要SessionID,小明的瀏覽器就自動(dòng)將SessionID傳給a.com,根據(jù)表單的含義,黑客就可以簡(jiǎn)介的控制小明在a.com上的行為.這種方法就是常見CSRF的一種.

那么,a.com如何甄別提交表單的是小明還是黑客呢?就是在表單中加入隱藏的一個(gè)Token,或使用驗(yàn)證碼,如果是黑客,這個(gè)Token是無法偽造的,而且驗(yàn)證碼攻破難度在現(xiàn)如今幾乎是不可能的.這樣,a.com檢測(cè)到的Token或驗(yàn)證碼錯(cuò)誤的情況下,不予操作.

其他工作

這樣一來,a.com在面對(duì)常規(guī)的攻擊時(shí)就能很好的應(yīng)對(duì)了.還有一些工作也要跟進(jìn),防患于未然.

1. 盡可能頻繁的更換SessionID

比如在登錄成功后為用戶更換SessionID.

2. 敏感操作時(shí)二次驗(yàn)證

例如支付時(shí)要求輸入密碼或驗(yàn)證碼.

3. 編寫可靠的SESSION回收程序

PHP的SESSION在過期后不會(huì)被立即刪除,而是要等待gc(垃圾清理)程序不定期清理.高可靠性的網(wǎng)站應(yīng)該盡量自己實(shí)現(xiàn)gc,在SESSION過期后盡可能快的刪除.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容