Cookie 禁用了,Session 還能用嗎?

vinhson發表於2019-03-20

在預設的JSP、PHP配置中,SessionID是需要儲存在Cookie中的,預設Cookie名為:

PHPSESSIONID

JSESSIONID

以下以PHP為例:

你第一次訪問網站時,

服務端指令碼中開啟了Sessionsession_start();,

伺服器會生成一個不重複的 SESSIONID 的檔案session_id();,比如在/var/lib/php/session目錄

並將返回(Response)如下的HTTP頭 Set-Cookie:PHPSESSIONID=xxxxxxx

客戶端接收到Set-Cookie的頭,將PHPSESSIONID寫入cookie

當你第二次訪問頁面時,所有Cookie會附帶的請求頭(Request)傳送給伺服器端

伺服器識別PHPSESSIONID這個cookie,然後去session目錄查詢對應session檔案,

找到這個session檔案後,檢查是否過期,如果沒有過期,去讀取Session檔案中的配置;如果已經過期,清空其中的配置

如果客戶端禁用了Cookie,那PHPSESSIONID都無法寫入客戶端,Session還能用?

答案顯而易見:不能

並且服務端因為沒有得到PHPSESSIONID的cookie,會不停的生成session_id檔案

但是這難不倒服務端程式,聰明的程式設計師想到,如果一個Cookie都沒接收到,基本上可以預判客戶端禁用了Cookie,那將session_id附帶在每個網址後面(包括POST),
比如:

GET http://www.xx.com/index.php?session_id=xxxxx
POST http://www.xx.com/post.php?session_id=xxxxx

然後在每個頁面的開頭使用session_id($_GET['session_id']),來強制指定當前session_id

這樣,答案就變成了:能

聰明的你肯定想到,那將這個網站傳送給別人,那麼他將會以你的身份登入並做所有的事情
(目前很多訂閱公眾號就將openid附帶在網址後面,這是同樣的漏洞)。

其實不僅僅如此,cookie也可以被盜用,比如XSS注入,透過XSS漏洞獲取大量的Cookie,也就是控制了大量的使用者,騰訊有專門的XSS漏洞掃描機制,因為大量的QQ盜用,發廣告就是因為XSS漏洞

所以Laravel等框架中,內部實現了Session的所有邏輯,並將PHPSESSIONID設定為httponly並加密,這樣,前端JS就無法讀取和修改這些敏感資訊,降低了被盜用的風險。

禁用Cookie是 IE6 那個年代的事情,現在的網站都非常的依賴Cookie,禁用Cookie會造成大量的麻煩。

在Flash還流行的年代,Flash在提交資料會經常出現使用者無法找到的情況,其實是因為Flash在IE下是獨立的程式,無法得到IE下的Cookie。
所以在Flash的flash_var中,一般都會指定當前的session_id,讓Flash提交資料的時候,將這個session_id附帶著提交過去
Chrome中使用 Flash沙箱 已經解決了cookie的問題,但是為了相容IE,比如swfupload等flash程式都要求開發者附帶一個session_id
本作品採用《CC 協議》,轉載必須註明作者和本文連結
不要輕易放棄。學習成長的路上,我們長路漫漫,只因學無止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.

相關文章