從PHP了解cookie/session原理

從PHP了解cookie/session原理

更新於 發佈於 閱讀時間約 3 分鐘
raw-image

如上圖程式碼,session_start();
其實就是在client端建立unique id的cookie。

如下圖,http response header中會夾帶Set-Cookie。

raw-image

如下圖,可以從開發者工具清楚看到cookie被設定上去!
key是 PHPSESSID, value則是不重複的session id.

raw-image

此外會在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如下:

raw-image

可以發現response header中已經沒有Set-Cookie了,因為已經有設定了!

raw-image

由於第一次網頁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加密,是很難被竊取資料的!

avatar-img
Vic Lin的沙龍
21會員
161內容數
留言
avatar-img
留言分享你的想法!
Vic Lin的沙龍 的其他內容
jQuery ajax & php example 第一種方式 使用application/x-www-form-urlencoded 第二種方式 使用application/json
JavaScript在ES6新增了let, const等宣告變數的方式,其中let, const是block scope的,而var則是function scope。
promise是ES6才有的,它是一種非同步的技術,使用它除了可以在background處理一些事情以外,還可以增加程式碼的可維護性。
jQuery ajax & php example 第一種方式 使用application/x-www-form-urlencoded 第二種方式 使用application/json
JavaScript在ES6新增了let, const等宣告變數的方式,其中let, const是block scope的,而var則是function scope。
promise是ES6才有的,它是一種非同步的技術,使用它除了可以在background處理一些事情以外,還可以增加程式碼的可維護性。