2014-05-07 398 views
3

我對使用PHP中的會話有些困惑,在登錄後維護用戶會話。因此,爲了維護會話,我們可以使用的一種方法是使用PHP中的session_start()。PHP中的會話和登錄混淆

現在,session_start()會生成一個唯一的sessionID,並使用此ID向瀏覽器發送一個cookie,如果我是正確的(正如我從幾個資源中讀取的那樣)。

現在我們來看一個簡單的用戶登錄用例,我需要維護會話。因此,通常情況下,一個非常簡單的情況是,用戶日誌在表單上的相應字段中輸入他的用戶名和密碼。然後用戶按下提交按鈕。

將POST值發送到處理會話的PHP腳本(如login.php)。在login.php裏面,我檢查$ _POST ['username']和$ _POST ['password'],看它是否與數據庫中的值匹配。我們假設值匹配。

所以現在應該創建一個新的會話,對吧?爲什麼我們在login.php的開頭包含session_start()呢?

其次,所以在會話啓動後創建一個sessionID後,它會通過cookie發送到瀏覽器,並記錄在$ _SESSIONS全局變量中。那麼現在的事情就是我們將這個會話與這個特定用戶綁定在一起嗎?據我所知,由於Cookie將由用戶發送每一個請求,並且由於服務器具有相同的sessionID,就像在Cookie中一樣,它也保存在它的最後,服務器會知道請求來自同一用戶。但是,我們並沒有在這個用戶的任何地方(在db等)顯式地記錄這個sessionID。所以如果我需要關於這個用戶的所有其他細節,我將如何得到它?那麼會話ID是如何與存儲在數據庫中的特定用戶的詳細信息相關聯的呢?

舉個例子,我們假設在上面的例子中,我們討論的用戶是用戶A。對於第二個用戶,說用戶B也是如此。因此,現在服務器一定能夠區分來自這兩個用戶的請求,因爲這些用戶將在cookie中發送兩個不同的會話ID與他們的請求。但在服務器端,USER A的請求將如何與數據庫中的USER A的詳細信息相關聯,以及USER B的請求如何與數據庫中的USER B的詳細信息相關聯?

回答

2

清除你的困惑,我會逐點去點

So a new session should be created now, right? Why do we include session_start() in the beginning of login.php then?

我們包括session_start()因爲它說PHP然後開始會話,然後你可以將任何信息存儲在$_SESSION,所以session_start()是必要的


But on the server side, how will USER A's request be linked with USER A's details in the db and how will USER B's request be linked with USER B's details in the db ?

當用戶登錄時,我們將用戶的(唯一)信息存儲在$ _SESSION中。

例如,如果用戶A登錄,我將從db獲取他的ID並將其存儲在$_SESSION['uid']和其他信息中,如果需要的話。

然後,當我想要任何頁面上的用戶A的其他信息時,我只需從$ _SESSION獲取他的ID並根據此查詢。


我希望這會消除你的困惑。

+0

嗨@TechnoKnol感謝您的答覆。我的第二個答案聽起來很清楚。但是,對於我的第一個問題,我的意思是,現在應該創建一個新的會話,對吧?爲什麼我們在login.php的BEGINNING中包含session_start()呢? – qre0ct

+0

你有沒有在php.net上引用'session_start()'? 'session_start()'只告訴PHP開始會話不存儲任何信息。所以如果你在任何地方使用'session_start()'而不是在$ _SESSION中存儲任何信息,那麼它將不允許用戶登錄。 –

+0

我在這裏閱讀它http://www.sitepoint.com/users-php-sessions-mysql/ session_start()會自動設置一個cookie。 – qre0ct

1

在檢查到您的頁面已發佈POST後,您可以設置$ _SESSION變量來保存已登錄的用戶的一些信息以供進一步使用。

首先,您必須使用session_start()開始您的會話,如您所述。 之後,檢查用戶提供的憑據是否與數據庫中的信息匹配。 現在,如果用戶應該試試這個記錄(或某事像它...)

$_SESSION['logged_in'] = true; 
$_SESSION['username']= $_POST['username']; 

並存儲所有其他信息後,您可能需要。 訪問這些信息與存儲它們一樣簡單。只需使用$_SESSION['variable-name']訪問會話中的存儲值 ,例如獲取當前登錄用戶的「用戶名」,您可以使用$username = $_SESSION['username']; 我希望它有幫助。

+0

我明白這一點。感謝@Mithredate現在,第二件事情是,從安全角度來看,如果USER B只是能夠訪問USER A的cookie併發送請求,他是否能夠訪問USER A的數據? – qre0ct

+0

是的,當然用戶B將能夠以用戶A的身份登錄。但是有很多方法可以否認這一點。 –

+0

會話的cookie應該存儲在服務器端,所以如果有機會用戶能夠訪問您存儲的cookie,他可能能夠得到任何他想要的方式太容易了...... – Mithredate

0

所以基本上我對http://www.php.net/manual/en/session.examples.basic.phphttps://www.youtube.com/watch?v=0dq5Sj9jyKU的會話有了更清晰的瞭解。

只是一個溫柔的筆記: - 這個答案是爲了幫助我更好地理解會議。

SO基本上PHPSessionID和對應的一個特定的用戶在服務器上創建會話具有以下關係和工作流程: -

  1. 用戶沒有在迄今已登錄。
  2. 用戶在前端表單上輸入憑證並點擊提交。
  3. 處理登錄的login.php(服務器端)腳本被傳遞給表單數據。
  4. 用戶的憑證與存儲在數據庫中的憑證相匹配。
  5. 如果它們匹配,則應該啓動此用戶的會話。
  6. 所以要做到這一點,在login.php的開頭本身,在我們需要寫任何其他代碼之前寫session_start()。現在什麼在session_start()不會在這種情況下,這裏是這樣的: -

    • 它的客戶端
  7. 上生成PHPSessionId

  8. 並將其存儲在一個cookie現在,因爲用戶通過身份驗證後,他將獲得歡迎屏幕或用戶在成功登錄後需要發送到的任何屏幕。

  9. 假設用戶被髮送到welcome_member.php。
  10. 所以基本上,當我說用戶是發送到welcome_member.php,我的意思是,通常客戶端被要求頁面welcome_member.php(例如通過使用PHP中的header()後登錄或者說讓用戶在登錄後點擊某個鏈接訪問此頁面,如上面的youtube鏈接所示)。
  11. 當客戶端發送請求時,它會攜帶與該站點有關的所有cookie。因此,這裏的這些cookie中的一個包含我們的PHPSessionID,它也隨此請求一起發送到頁面welcome_member.php。

  12. 現在welcome_member.php需要顯示特定於登錄用戶的信息。

  13. 所以要做到這一點,我們在上面的第5步和第6步做一個小的修改。因此,在用戶的憑證匹配成功後,我們還創建一個會話變量,其中我們將一些特定於此用戶的唯一信息存儲到此變量中。舉例來說,我們將用戶的唯一ID存儲到會話變量loggedInUser中: -

    $ _SESSION ['loggedInUser'] = $ userID; //其中userId是從數據庫中檢索的用戶的唯一用戶標識。

  14. 現在可能會有很多用戶在使用該應用程序。因此,對於所有這些用戶來說,以上所有內容都是真實的。因此,將爲所有成功登錄的用戶創建上述會話和會話變量。

  15. 所以應該有一種方法讓服務器區分所有這些會話。

    所以這是PHPSessionId進入圖片的地方。在服務器上,PHP使用此PHPSessionId區分不同會話,因爲每個用戶此ID都是唯一的。因此,根據這個ID,PHP會選擇從內部存儲中選擇哪個特定會話。因此,舉例來說,對於用戶A,例如,生成的PHPSessionId是1234。所以這將由PHP內部存儲,例如標籤上寫着「此會話保存用戶A的信息」。對用戶B同樣如此,例如,生成的PHPSessionId爲6789。因此,這將由PHP內部存儲,例如標籤上寫着「此會話保存用戶B的信息」。

  16. 現在回到上面的第12點,其中welcome_member.php需要訪問特定於我們登錄用戶的一些信息。

  17. 所以在這裏,在welcome_member.php中,爲了訪問當前用戶的會話和我們以前存儲在這個會話中的所有信息(在我們的例子中只是userID),我們需要再次使用session_start()頁面(當然,在任何其他代碼之前,在welcome_member.php頁面的開頭)。

  18. 現在在這種情況下,session_start()不像上面的步驟6那樣重新啓動另一個會話。但是,在這種情況下,由於頁面welcome_member.php是從客戶端調用的,因此cookie中已經有一個有效的PHPSessionID。正如第14步和上面的段落所述,此會話ID用於檢索存儲在此登錄用戶的會話中的所有信息(只是我們的案例中的用戶ID)。

  19. 回來再次welcome_member.php,現在我們已經保存在session變量$ _SESSION我們的用戶UNIQUEID [「與loggedInUser」],我們就可以使用這個值來獲取關於從用戶的任何其他細節數據庫。

  20. 現在對於每個需要訪問本會話信息的頁面(或者換句話說,需要維護一個頁面用戶會話),我們只需調用session_start(),並按照上面步驟17中的說明進行操作。