在我的PHP網站上,用戶可以登錄並可以選中「記住我」來設置cookie。PHP登錄會話和cookie
我該如何儲存SESSION
變量?用戶名,散列密碼和user ID
,或只有user ID
?如果我只存儲user ID
,那麼是否有人可以編輯SESSION
並更改ID?
那麼COOKIE
呢?我應該只儲存user ID
嗎?據我所知,cookies可以由最終用戶修改...
在我的PHP網站上,用戶可以登錄並可以選中「記住我」來設置cookie。PHP登錄會話和cookie
我該如何儲存SESSION
變量?用戶名,散列密碼和user ID
,或只有user ID
?如果我只存儲user ID
,那麼是否有人可以編輯SESSION
並更改ID?
那麼COOKIE
呢?我應該只儲存user ID
嗎?據我所知,cookies可以由最終用戶修改...
看起來你對會話和cookies沒有清晰的認識!
沒有人可以改變會議內容,除了你的代碼(在攻擊旁邊)。因此,您可以存儲需要頻繁訪問的所有內容(合理的),例如user id
或username
。在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覆蓋這個概念。希望能幫助到你。
您應該將隨機會話值存儲在cookie中。你絕對不應該在cookie中存儲關於用戶的任何信息。然後,您可以檢查每個頁面加載的Cookie中的會話ID,以確保(a)用戶應該有權訪問該內容,並且(b)會話ID有效。
在PHP中,您可以使用session_set_cookie_params
和session_name
來設置Cookie的參數。
用戶不能編輯會話變量,它們在服務器上進行管理。
會話變量優勢
1)安全
2.)魯棒
會話缺點 1。)壽命短的時間,直到會話中,
會議被摧毀
當用戶關閉他的瀏覽器 服務器重啓
會話中使用session_destroy銷燬();
所以會更安全
餅乾,另一方面讓你記住用戶prefrences
如果使用兩者的結合,那麼它的優勢,你的代碼
You can store userid and username in cookie, then verify user identity using its combination.
如果它不是退出然後您可以登錄用戶並保持會話中的信息以及更新cookie。
感謝您的澄清;你能否給出使用cookies重新登錄用戶的最佳做法?我無法弄清楚我將如何繼續...... –
檢查更新!該代碼即時寫入!所以如果你看到錯字或錯誤,我很抱歉,嘗試修復它或告訴我的問題 – Boynux
謝謝,這似乎是一個好方法。你對此有何看法:http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/?對我來說似乎很好。但它過時了嗎? –