2013-07-05 247 views
4

在我的PHP網站上,用戶可以登錄並可以選中「記住我」來設置cookie。PHP登錄會話和cookie

我該如何儲存SESSION變量?用戶名,散列密碼和user ID,或只有user ID?如果我只存儲user ID,那麼是否有人可以編輯SESSION並更改ID?

那麼COOKIE呢?我應該只儲存user ID嗎?據我所知,cookies可以由最終用戶修改...

回答

17

看起來你對會話和cookies沒有清晰的認識!

沒有人可以改變會議內容,除了你的代碼(在攻擊旁邊)。因此,您可以存儲需要頻繁訪問的所有內容(合理的),例如user idusername。在Cookie中,您必須存儲一些模糊的信息,以便稍後他/她嘗試訪問您的頁面時可以識別該用戶。所以根據cookie內容可以重新生成用戶會話(即自動重新登錄用戶)。只是要注意用戶可以更改Cookie內容,因此出於安全原因不能像user id那樣簡單。

我只是給你一個簡單的例子,它遠非完美,但並不那麼糟糕!您可能需要定製它適合您的方案:

在這裏你可以創建cookie的內容是這樣的:

$salt = substr (md5($password), 0, 2); 
$cookie = base64_encode ("$username:" . md5 ($password, $salt)); 
setcookie ('my-secret-cookie', $cookie); 

// and later to re-login user you do: 
$cookie = $_COOKIE['my-secret-cookie']; 
$content = base64_decode ($cookie); 
list($username, $hashed_password) = explode (':', $hash); 

// here you need to fetch real password from database based on username. ($password) 
if (md5($password, substr(md5($password), 0, 2)) == $hashed_password) { 
    // you can consider use as logged in 
    // do whatever you want :) 
} 

UPDATE:

我寫this article覆蓋這個概念。希望能幫助到你。

+0

感謝您的澄清;你能否給出使用cookies重新登錄用戶的最佳做法?我無法弄清楚我將如何繼續...... –

+0

檢查更新!該代碼即時寫入!所以如果你看到錯字或錯誤,我很抱歉,嘗試修復它或告訴我的問題 – Boynux

+0

謝謝,這似乎是一個好方法。你對此有何看法:http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/?對我來說似乎很好。但它過時了嗎? –

4

您應該將隨機會話值存儲在cookie中。你絕對不應該在cookie中存儲關於用戶的任何信息。然後,您可以檢查每個頁面加載的Cookie中的會話ID,以確保(a)用戶應該有權訪問該內容,並且(b)會話ID有效。

在PHP中,您可以使用session_set_cookie_paramssession_name來設置Cookie的參數。

0

用戶不能編輯會話變量,它們在服務器上進行管理。

會話變量優勢
1)安全
2.)魯棒

會話缺點 1。)壽命短的時間,直到會話中,

會議被摧毀
當用戶關閉他的瀏覽器 服務器重啓
會話中使用session_destroy銷燬();

所以會更安全

餅乾,另一方面讓你記住用戶prefrences

如果使用兩者的結合,那麼它的優勢,你的代碼

You can store userid and username in cookie, then verify user identity using its combination. 

如果它不是退出然後您可以登錄用戶並保持會話中的信息以及更新cookie。