2010-12-20 74 views
4

我有一個典型的登錄名(用戶名,密碼),並且還想包含'保存我的詳細信息'複選框。登錄表單將其值發佈到login_script.php,如果登錄成功,用戶將重定向到網站的主頁面。設置cookie以保存登錄詳細信息PHP

我綁用這種方法來保存的登錄信息

//Remember Me Function 

if(isset($_POST['remember_me'])){ 

    // Set a cookie that expires in 24 hours 
    setcookie("username",$username, time()+3600*24); 
    setcookie("password",$password, time()+3600*24); 

} 

現在從我個人理解,setcookie("username",$username, time()+3600*24);必須在PHP頁面的頂部執行任何其他代碼之前設置。

我的問題是,除非用戶成功登錄,否則我不想設置cookie。但是由於在登錄測試後在腳本中間調用了設置的cookie函數,它不起作用。

任何想法? 乾杯。

+54

**請勿在COOKIES中儲存密碼** – zerkms 2010-12-20 01:20:05

+4

Nooooo!不要這樣做 – 2010-12-20 01:20:38

+0

對密碼的好評! +1 – Beaker 2010-12-20 01:22:11

回答

7

首先:不要保存密碼在曲奇餅!這是一個非常糟糕的想法,安全明智。

至於你的問題:沒有辦法繞過它,你需要在設置你的cookie之前根本沒有輸出。有兩種方法來實現這一目標:

解決方案1:登錄頁面總是重定向

讓你的登錄請求去一個腳本,設置一個cookie(如果登錄成功),然後總是將用戶重定向到另一個頁面(例如歡迎屏幕,如果不成功則返回到登錄頁面)。登錄腳本不會發出任何輸出,因此您可以在重定向之前設置cookie。

解決方案2:輸出緩衝

開始output buffering在腳本的開始。檢查成功登錄後,首先設置Cookie ,然後停止輸出緩衝,如ob_end_flush

我個人認爲解決方案#1在功能上更加優雅和優越。

+0

也感謝您給我提供一些信息,而不僅僅是說「不要這樣做」。我還有其他信息來存儲其他信息,以便登錄信息,以便爲建議歡呼。 – 2010-12-20 01:38:22

2

在用戶有權訪問的地方(在客戶端)存儲密碼是一種非常糟糕的做法。更糟的是,在存儲密碼時,您沒有對密碼進行哈希或加密(客戶端可以看到密碼!)

一個好的安全策略絕不能讓任何人看到實際的密碼。除了代碼正在使用它。

你可以這樣做,而不是:

  • 在會話中存儲
  • 密碼延長會話到期較長時間

或者你可以改爲

  • 哈希並加密密碼
  • 存儲l ogin信息保存到文件服務器
  • 上爲文件的唯一名稱
  • 商店名稱每次收到正確的文件名的Cookie時間餅乾
  • ,查找文件,並檢索登錄信息。

但我總是推薦前者,因爲它更容易實現和會話處理由PHP(除非你重寫會話處理)

+5

「在會話中存儲密碼」---在會話中存儲密碼的任何理由?不是'user_id'足夠嗎? – zerkms 2010-12-20 01:28:13

+0

另外,如果您使用除文件系統,DBMS之外的任何持久存儲,則第二種情況可能會更好。 – zerkms 2010-12-20 01:30:36

+0

非常感謝你在這件事上教育我,而不是誹謗我的問題。我對新的方面還很陌生。 – 2010-12-20 01:36:37