2014-02-16 103 views
1

我使用PHP核心設計一個登錄系統,請參考下面的代碼 -聲明session_start()函數?

funciton login($username,$password) { 

// mysql query to check the username and password 

if($res == 1) { 

    session_start(); 
$_SESSION['username'] = $username; 
$_SESSION['loggedin'] = 1; 
return true; 

} 

} 

正如你可以看到,我已經開始登錄功能內部的會議上,有人告訴我是正確的或做我在應用程序的每個頁面上開始會話,即在公共頭文件中?

+0

改爲在代碼的頂部添加'session_start()'。 –

+0

這不是真的關於會話,但在函數聲明 –

+0

oko ...你的意思是我需要在整個應用程序中常見的頭文件中啓動會話......對嗎? – user3316682

回答

0

您應該嘗試看看session_start()啓動的「會話」與登錄或不登錄無關。在你的應用程序的每個腳本中(如果你的應用程序需要任何會話管理,那麼作爲你做的第一件事就是開始會話)。

會話代表您的網站上唯一訪客的「訪問」。理論上來說,訪問可以由連續的登錄/註銷對組成。它仍然是同一次訪問,但只是一個不同的登錄名。

例如,如果您的網站上有「選擇語言」下拉菜單,則可能需要存儲用戶在會話中所做的選擇。當用戶註銷時,您仍然可能需要保留所選語言。有關用戶登錄或不登錄的信息只是會話可以執行的一部分,因此會話應獨立於可能的登錄名而存在。

然後,您可以在該會話中存儲「已登錄」標誌和用戶名,並且只需在訪問者註銷後取消設置這兩個值。

+0

我同意「會話」不一定被視爲「登錄會話」的含義,但將其視爲「訪問」可能同樣存在問題,註銷時的清除狀態通常是一個好主意。如果有些事情需要生存下來,如果它們不是安全敏感的(例如首選語言),它們可以被複制到新的會話中,或者存儲在單獨的Cookie中,並具有不同的生命週期。 – IMSoP

+0

你能詳細說明爲什麼結算狀態「通常是一個好主意」?我看不到任何理由你應該清除所有內容,只有在註銷後將其複製到新的會話中。 – jelrikvh

+0

從一般原則來看,白名單比黑名單更安全:如果只清除那些您認爲敏感的部分,您可能會錯過某些東西;如果您只複製那些您認爲*不敏感的部分,並清除其他部分,則風險大大降低。 – IMSoP

0

session_start()並不意味着「現在創建會話」,它表示「打開當前會話,如果它存在,或創建,如果它不。

您可能想要銷燬舊會話並在登錄/註銷操作中創建一個新會話(有各種微妙的安全攻擊,如「會話劫持」和「會話固定」,避免這種攻擊可能非常棘手)。

但是您需要在每個頁面上運行session_start(),以確定用戶是否已經登錄。如果沒有,$_SESSION將爲空/未定義。