我相信你是一個誤解PHP會話如何工作。您可以安全地將用戶名,登錄狀態和其他內容存儲到$_SESSION
陣列中,因爲這是存儲在服務器端的。發送給瀏覽器的唯一東西是一個單獨的cookie(名爲PHPSESSID,除非您在php.ini
中進行了更改)包含會話ID - 這是一個唯一的隨機數。
一旦訪問者每次請求頂部有session_start()
的頁面,session_start()
都會查看名爲PHPSESSID的Cookie的請求,請閱讀serverside會話文件(如果會話存在並且有效)並恢復提交的$_SESSION
陣列。這個數組永遠不需要離開服務器。
會話Cookie設置爲沒有過期日期(除非您在php.ini中混淆session.cookie_lifetime
選項),因此瀏覽器在關機時將其刪除。服務器上的會話文件本身具有到期時間,由session.gc_maxlifetime
管理(以秒爲單位)。
路徑安全會議:
- 要保證在使用Cookie的會話ID傳遞到瀏覽器設置
session.use_cookies=1
,session.use_only_cookies = 1
,session.use_trans_id = 0
(饒你替代語法的細節)
- 防止會話劫持(即別人僞造現有會話)存儲到$ _SESSION一些標識瀏覽器 - 一個常見的模式是存儲在瀏覽器的User-Agent頭的
md5()
,該Accept頭,遠程IP地址或組合那些;檢查它是否在與現有的會話ID爲每個新請求匹配
- 如果你是一個共享的服務器上,你確實應該讓您的會議文件,從這些服務器鄰居分開:設置
session.save_path
到一個文件夾只有你和PHP訪問至。
最後,你應該創建一個腳本來將用戶登出會話(並鼓勵他們使用它而不是簡單的導航)。這是一個示例腳本:
<?php
session_start();
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
session_regenerate_id(true);
session_destroy();
session_write_close();
header('Location: your_login_page.php');
exit;
來源
2010-09-04 19:43:29
djn
我不明白你的代碼片段究竟你在做什麼。 – 2010-09-04 11:08:36
我將$ data數組傳遞給會話,以便它創建一個cookie。但是這看起來並不安全,我想知道如何讓它安全...... – networkprofile 2010-09-04 11:27:54