2009-12-25 115 views
10

當用戶登錄時,我得到他/她的ID並將其保存在會話變量中。我想知道的是,這是要走的路嗎?或者我應該使用cookie?所以它會自動登錄等等。Cookies /會話登錄系統

session_start(); 


ifcorrectlogin { 
$_SESSION['id'] = mysql_result($loginQuery, 0, 'user_id'); 
} 

您如何驗證您的用戶?

//新手

+0

歡迎StackOverflow上。偉大的第一個問題 – Sampson 2009-12-25 23:58:11

+1

謝謝!準備好更多的問題; P – Erkka 2009-12-26 00:20:56

回答

1

餅乾可以很容易被操縱。使用會話管理登錄/註銷。如果您願意,可以將用戶電子郵件地址/用戶名存儲在cookie中,並在當前會話過期後下次訪問時爲其填入用戶名框。

+0

第一句話有點矛盾。 PHP在cookie的幫助下維護會話。確保cookie值足夠強大。 – BalusC 2009-12-26 00:08:18

+0

Balus,我想我明白我的答案可能會有些混亂。閱讀完你的內容後,我認爲我們已經提供了相同的解決方案。 – Sampson 2009-12-26 00:14:51

1

我會試着找到一個會話引擎,所以你不必處理misc。安全問題,如果你犯了一些錯誤,那就咬你的屁股。我使用的是內置會話引擎的django。我並不知道該領域的其他產品,儘管我認爲大多數框架都有。

他們在django做的方式是在用戶的Cookie中放置一個加密哈希,每次頁面查看都會更新,並將所有其他會話信息保存在服務器上的數據庫中,以防止用戶篡改和安全問題。

5

是的,這是要走的路。該會議本身已經由一個cookie支持,以消除您的任何編程工作。只要用戶打開瀏覽器實例或者直到會話在服務器端超時,會話(實際上是cookie)就會存在,因爲用戶在某段時間(通常大約30分鐘)內未訪問該網站。

登錄時,只需將獲得的User置於$_SESSION。在受限制頁面上的每個請求上,您只需檢查登錄的User是否在$_SESSION中可用,並相應地處理請求,即繼續處理請求或重定向到登錄或錯誤頁面。在註銷時,請從$_SESSION中刪除User

如果你想添加一個在這臺電腦上記住我選項,那麼你需要自己添加另一個cookie,它的壽命比會話長。您只需確保爲cookie生成一個長期,唯一且難以猜測的值,否則它很容易被破解。看看PHP如何通過在網頁瀏覽器中使用名稱phpsessionid來檢查cookie。

+0

所以如果我明白如果用戶想要被「記住」正確,我應該存儲一個獨特的字符串在一個cookie和分貝,當用戶再次訪問我檢查如果存在的cookie,如果它確實存在我比較它與一個在db? – Erkka 2009-12-26 00:26:34

+1

差不多。當一個**未登錄的用戶訪問時,然後檢查DB關聯的用戶,然後「自動」登錄。我發佈了一個答案,其中涵蓋了這一點,你可能會覺得它有用以及:http://stackoverflow.com/questions/1877242/keep-user-logged-in-when-he-visit-the-same-page-again/1877304#1877304 – BalusC 2009-12-26 00:34:33

0

由於BalusC提到,session_在php的功能是要走的路,你的基本想法是健全的。但是仍然有許多不同的實現,其中一些有其陷阱。 例如,如Jonathan Samson所解釋的,使用cookie可能會導致安全漏洞。

我的PHP是一個有點生疏,但我記得session_ -functions也可以使用URL中的編碼會話ID。 (還有有這個自動添加到所有本地鏈接(如GET)和形式的目標(如POST)的選項。但是,這也不是沒有風險的,無論是。),以防止會話劫持複製SID爲的一種方式記住IP地址並將其與任何帶有有效會話ID的請求進行比較,以將其與發送此請求的IP進行比較。

正如你所看到的,底層的方法僅僅是個開始,還有更多的事情要考慮。因此,需要考慮SapphireSun的建議:通過使用經過良好測試的庫,您可以獲得高級別的安全性,而無需花費寶貴的開發時間來開發自己的會話系統。我會推薦這種方法適用於任何想要在現實世界中部署的系統。

OTOH,如果你想了解PHP會話和安全問題,你一定要自己做,如果只是爲了瞭解做;-)