如上圖程式碼,session_start();
其實就是在client端建立unique id的cookie。
如下圖,http response header中會夾帶Set-Cookie。
如下圖,可以從開發者工具清楚看到cookie被設定上去!
key是 PHPSESSID, value則是不重複的session id.
此外會在server disk建立這個session id的檔案,裡面則是放我們設定的key value,由於每個http request瀏覽器都會在header放入cookie, 因此這個session id會被帶到server, 一旦server比對發現有這個session id的檔案時,就能取出指定的key value值了! 所以其實我們可以自己實作session呢! 不一定要用php提供的!
不過如果user把瀏覽器的cookie功能關掉,就會造成每次的http request都不會再帶cookie了,而且php中session_start(); 也會沒辦法建立cookie,因此session功能就會失效,因為cookie被關掉了!
接著我重新整理一下網頁,request/response header如下:
可以發現response header中已經沒有Set-Cookie了,因為已經有設定了!
由於第一次網頁load後已經有設定cookie了,所以往後每次的request header都會帶上Cookie。
#note 如何避免session id被挾持?
1. 設定cookie HttpOnly:
一般我們會設定cookie為HttpOnly(php server可以設定),也就是設定不能透過javascript來存取cookie,這是為了避免被XSS攻擊,攻擊者可以透過javascript來拿到cookie,因此就會被拿到session id,這是相當危險的!
所以網站防禦XSS攻擊是很重要的呢! 一旦有XSS漏洞,就有可能被偷走cookie中設定的session id!
2. 關閉phpinfo頁面
phpinfo裡面包含了cookie資訊,如果沒有關閉這個頁面,就會給駭客有機會拿到cookie!
3.改為https
https也可以達到防禦的效果,傳輸過程中都透過SSL加密,是很難被竊取資料的!