2010-09-04 61 views
2

我有一個關於會話的問題。你如何做一個安全的登錄會話/ cookie。 我一直在尋找在這個例子中,他們這個陣列添加到會話:php中的安全會話/ cookie

$data = array{ 

    username = $_POST['username']; 
    is_logged = true; 

} 

我想知道,這是足夠了嗎?是不是可以將cookie中的用戶名更改爲任何人或任何人?這將是一個好方法嗎?

或者這是完全安全的,我錯過了什麼?

另外,你們認爲如何將會話存儲在數據庫中?我知道CI有一個內置的功能來做到這一點。這是否會在性能方面造成任何問題,還是值得歡迎?

+1

我不明白你的代碼片段究竟你在做什麼。 – 2010-09-04 11:08:36

+0

我將$ data數組傳遞給會話,以便它創建一個cookie。但是這看起來並不安全,我想知道如何讓它安全...... – networkprofile 2010-09-04 11:27:54

回答

9

我相信你是一個誤解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=1session.use_only_cookies = 1session.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; 
+0

謝謝,你是對的我正在混淆會話與餅乾!非常明確的解釋! – networkprofile 2010-09-04 21:47:43

0

是的,這是一個非常不安全的方法,如果你想防止會話劫持不應在任何地方使用。

更魯棒的方法將被生成用於所述用戶的唯一的會話ID(例如,散列),當她登錄和會話與此ID的服務器端相關聯。然後,將cookie中的這個會話ID僅發送回客戶端。當客戶端使用cookie發送請求時,您可以獲取會話ID併爲您的請求處理恢復與其關聯的用戶名和任何其他信息。

客戶端訪問cookie中的會話ID,但該值是毫無意義的,因爲他自己無法從中推斷出任何信息,併發送隨機會話ID都有成功的機會非常少。

+0

你的意思是我應該例如在發送給cookie的時候在用戶ID上應用md5函數,或者我應該使用一些生成哈希時的關鍵點,以便我可以恢復用戶ID?謝謝! – networkprofile 2010-09-04 11:23:17

+0

您應該生成不可預測的內容,否則惡意用戶可能會使用不同的用戶ID繼續生成值並對它們進行散列處理。你可以生成一個形式爲[userID] [一些隨機數據]的字符串,然後對其進行哈希處理。隨機數據可以使用PHP的uniqid()函數生成。這樣你會很安全。 – 2010-09-04 11:39:37