2009-10-27 133 views
6

我正在尋找關於如何使用Cookies最佳地將驗證與PHP結合的技巧和想法。使用Cookies進行PHP驗證的最佳做法是什麼?

每個php腳本應該檢查cookie值以確定用戶是否仍然登錄?是否應該有一個腳本執行此檢查並將其包含在每個其他腳本中?可以通過php從不同深度的文件系統看到cookie值嗎?

像:blahblahblah.com/和blahblahblah.com/login/

可他們都讀取cookie?

很多問題在一個職位,但謝謝!

+0

安全是一個領域,如果你不得不問,你沒有足夠的經驗來建造它自己。您將不可避免地創建某種類型的漏洞,並最終爲其付費。那裏有體面的auth圖書館,由對安全問題有深刻理解的人撰寫。挑一個並使用它。 – 2009-10-28 00:05:52

+0

如果它不是一個關鍵的應用程序,那麼從零開始構建身份驗證可能是非常教學的。 - 但是,由於有很多優秀的框架(Zend Framework,Symfony,CakePHP),如果您不重新發明輪子並自己完成所有工作,您會得到更好的結果。 – 2009-10-28 14:41:44

+0

感謝大家的回答。很有幫助。我使用php會話來保存表單輸入值,並有一個'重啓'腳本來破壞會話。這就是爲什麼我期待使用cookie進行身份驗證而不是php的會話。但基於對此線程的響應,我需要在服務器端保持身份驗證。並感謝您的PHP框架參考。我使用了一些但不是Symfony或CakePHP。去嘗試一下。 – 2009-10-28 16:11:35

回答

3

客戶端沒有什麼是安全的。

您可以在任何瀏覽器上輕鬆更改Cookies上的登錄標誌。因此,更推薦在php的$ _SESSION

上保存與登錄相關的數據如果您想延長會話,只需查看session_set_cookie_params()即可。

默認情況下,同一會話將用於當前域和該域上的所有路徑。因此它對於blahblahblah.com/和blahblahblah.com/login/都是可讀的。

當用戶登錄時,將密碼的用戶名和散列保存在Session中。

在每個腳本的開始處,使用數據庫中的驗證用戶名和密碼。如果是正確的,則設置一個標誌(例如$ userLoggedIn = true),以在服務器端表明用戶已登錄。否則爲false。

0

它是一個好主意,讓一個腳本進行會話/登錄檢查並將其包含在安全頁面中。至於深度,你可以在setcookie()中定義目錄參數是否設置爲「/」,那麼它的全部可訪問性。

一般而言,使用會話而不是cookie是一個好主意,因爲這樣做更安全,但您可以決定基於cookie中的加密數據構建自己的會話系統,並且可以工作,但是會話建議在服務器端的數據。

0

這個cookie是每個域的,所以無論你的目錄結構有多深,cookie都會被讀取OK(只要你的域保持不變 - NB就意味着www.example.com和example。 com可以是不同的cookie)。

我建議進行身份驗證檢查,將cookie中的會話ID與例如列出登錄用戶及其會話ID的數據庫表進行比較 - 此檢查可以在其自己的方法/ include文件中包含include() '在每個頁面上。這樣,檢查將在每次頁面加載時執行。 NB這是基本的,還有更安全的方法 - 其中一些在這裏的其他評論中已經提到。

儘管Mauris said雖然,客戶端沒有什麼是安全的 - 不要使用cookie來存儲您檢查true/false的「logged_in」值!

2

一些想法,沒有特定的順序:

  • 分離出各層:永久存儲器VS認證。
  • PHP會話非常強大,並且是保持持久存儲的推薦方式。
  • 您可以擁有有效的會話,但不是有效的登錄名。
  • 避免多個cookie。一個就足夠了。 PHP會話使用一個cookie。
  • 您可以在cookies上設置子域名和路徑,但除非設置了很多,否則確實有點小問題,這是不推薦的(見上文)。
  • 將您認爲可能需要的所有內容放入會話中的cookie中。
  • 你應該有一些你的頁面包含的通用代碼。這是您初始化會話的地方。那麼一切都會正常工作。它也可以驗證登錄是否有效。
  • 有一個地方做登錄認證和所有與之相關的東西。
  • 不要忘記註銷屏幕!
相關問題