校友錄專案需身份驗證,經評估 Cookie 易竄改、Session 易膨脹導致效能下降,決定採用「MD5 加密 ID + 資料庫記錄瀏覽狀態」的無狀態驗證方案。
user_id = MD5(隨機值),各頁面透過 URL 參數傳遞。a684dd572b1887661782981659331eed (32 位)。validate_id($link, $id, $ip, $page_name, $student_id) 返回 0/1。logging 表:同 ID、同 IP、最近 20 分鐘內有記錄 → 更新記錄 → 返回 1。CREATE TABLE logging (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id CHAR(32) NOT NULL,
logging_ip VARCHAR(20) NOT NULL,
page_name VARCHAR(30) NOT NULL,
view_time TIMESTAMP NOT NULL,
student_id VARCHAR(20)
);
function validate_id($link,$id,$ip,$page_name,$student_id="") {
if($id=='a684dd572b1887661782981659331eed' || $id=='') {
// 匿名記錄
mysql_db_query("web", "INSERT INTO logging ... VALUES ('匿名ID','$ip','$page_name','anonym')", $link);
return 0;
}
// 計算 20 分鐘前時間戳 (手動運算,避免資料庫函數相容性問題)
$time_string = ...; // 年月日時分秒字串
$query = "SELECT id FROM logging WHERE user_id='$id' AND logging_ip='$ip' AND view_time>'$time_string'";
$result = mysql_db_query("web", $query, $link);
if(mysql_num_rows($result)==0) {
// 離線,記錄匿名
return 0;
} else {
// 在線,更新記錄
mysql_db_query("web", "INSERT INTO logging ... VALUES ('$id','$ip','$page_name')", $link);
return 1;
}
}
此方案展示了無狀態驗證的另類思路,適合特定場景,生產環境建議結合 JWT 或 OAuth 2.0 等現代標準。