2013-08-26 55 views
1

因此,如果記住我被點擊,這裏是我的代碼發送一年的過期時間。 如果沒有,那麼它會將session_set_cookie_params()設置爲0.這意味着它應該在瀏覽器關閉時銷燬會話。然而,由於某種原因,它並不像那樣工作。

這是我的登錄頁面:

session_start(); 
if (isset($_POST['username']) && isset($_POST['password'])) { 

    if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) { 

    if (isset($_POST['rememberme'])) { 
     $_SESSION['username'] = $user; 
     $_SESSION['start'] = time(); 
     $_SESSION['expire'] = $_SESSION['start'] + (60*60*24*365); 
} 
    else{ 
     $_SESSION['username'] = $user; 
     session_set_cookie_params(0); 
    } 
    header('Location: index.php'); 

} else { 
    $p->addContent('<font color = red>Wrong</font>'); 
} 
} 

這是我的索引頁:

session_start(); 


if (isset($_POST['rememberme'])){ 
    $user = $_SESSION['username']; 

} 
else { 
    $user = $_SESSION['username']; 
    session_set_cookie_params(0); 
} 

if ($user == null) { 
    $user = 'Guest'; 
    $logout = $p->header()->addButton('Login', 'login.php', 'a', 'home', false, false, true); 
    $logout->rel('external'); 
} 
else{ 
    $logout = $p->header()->addButton('Logout', 'logout.php', 'a', 'delete', false, false, true); 
    $logout->rel('external'); 
} 

回答

2

這很簡單。session_set_cookie_params(0);在調用session_start();後不會影響您的會話。

只需重新排列你的代碼是這樣的:

if (isset($_POST['username']) && isset($_POST['password'])) { 
    if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) { 
     if (isset($_POST['rememberme'])) { 
      session_start(); 
      $_SESSION['username'] = $user; 
      $_SESSION['start'] = time(); 
      $_SESSION['expire'] = $_SESSION['start'] + (60*60*24*365); 
     } else { 
      session_set_cookie_params(0); 
      session_start(); 
      $_SESSION['username'] = $user; 
     } 
    header('Location: index.php'); 
    } else { 
     session_start(); 
     $p->addContent('<font color = red>Wrong</font>'); 
    } 
} else { 
    session_start(); 
} 

編輯:

這也是值得什麼,session_set_cookie_params只對當前腳本工作,並在每次使用session_start()時間再次調用。設置一個cookie來指示它是否應該使用可能是有用的。

+0

darn,我認爲這會奏效。它看起來很對我哈哈。我關閉了我的瀏覽器,回到index.php,但會議仍在進行。 :/幾乎卡在這裏。 –

1

由於你的代碼,session_set_cookie_params()不是在任何情況下調用。因此,我建議這樣做:

session_set_cookie_params(0); 
session_start(); 

if (isset($_POST['username']) && isset($_POST['password'])) { 
... 

請注意,這是真正有用的,以隨時撥打session_set_cookie_params()會話cookie。

在每個用戶級別變化

生成一個新的會話ID爲保護您的應用程序來抵禦攻擊者,這是絕對需要的用戶的角色的每次更改後改變的SessionID:

  • 匿名用戶 - >登錄的用戶
  • 登錄的用戶 - >匿名用戶
  • 在用戶登錄 - >管理登錄用戶
  • ...

因此,如果用戶獲取登錄或註銷,請重新生成會話ID像這樣:

session_regenerate_id(true); 

看一看OWASPPHP security cheat sheet

會話文件會定期

刪除使用PHP的標準會話策略,會話被映射到常規文件,所謂的會話文件。如果用戶關閉他的瀏覽器,會話文件將一直存在於文件系統中。很可能,操作系統將每天刪除一次會話文件(晚上)。

因此,如果用戶一天後回來,sessionID cookie將指向會話文件,該文件可能不再可用

公用電腦

此外想象一個公共的PC上運行的瀏覽器的情況下,如果用戶關閉瀏覽器,並在新用戶登錄,其他用戶就會自動登錄

+0

在所有情況下都不會將瀏覽器退出時的會話設置爲關閉。我不想那樣。我只想將它設置爲0,因爲當記住我沒有點擊時。 –

+0

非常感謝所有這一切,這是沒有必要的。但我會通讀這:)。 –

+0

@AnujHari不客氣! PHP安全備忘單非常有價值! – SteAp

相關問題