2010-04-08 109 views
1

我是一名初學者,我嘗試創建一個登錄和註銷。但我在註銷時遇到問題。我只是註銷要求的登錄形式是這樣的:在php中登出腳本的問題

<? 
session_start(); 
session_destroy(); 
?> 
<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> 
<tr> 
<form name="form1" method="post" action="checklogin.php"> 
<td> 
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> 
<tr> 
<td colspan="3"><strong>Member Login </strong></td> 
</tr> 
<tr> 
<td width="78">Username</td> 
<td width="6">:</td> 
<td width="294"><input name="myusername" type="text" id="myusername"></td> 
</tr> 
<tr> 
<td>Password</td> 
<td>:</td> 
<td><input name="mypassword" type="text" id="mypassword"></td> 
</tr> 
<tr> 
<td>&nbsp;</td> 
<td>&nbsp;</td> 
<td><input type="submit" name="Submit" value="Login"></td> 
</tr> 
</table> 
</td> 
</form> 
</tr> 
</table> 

我的問題是,當我嘗試按瀏覽器的後退按鈕。無論用戶使用它,仍然可以訪問用戶未登錄時不應該訪問的內容。 我是否需要在用戶頁面上添加代碼? 我有用戶頁面上此代碼:

<? 
session_start(); 
if(!session_is_registered(myusername)){ 
header("location:main_login.php"); 
} 
?> 

你能推薦我會做這樣一個腳本會提示,當用戶單擊後退按鈕再次輸入用戶名和密碼。

回答

0

您已銷燬會話,但正在使用不推薦使用的函數session_is_registered()來檢查用戶是否仍有權限。正如你可以看到here,你不應該再使用這個。

取而代之,當用戶在登錄頁面上被授權時,請設置$_SESSION['user'] = true。您也可以將其設置爲關於該用戶的一些數據。例如,我喜歡儘可能多地註冊用戶信息,以防止將來多次查詢數據庫。

然後,當您在註銷腳本中使用session_destroy時,此變量將被取消設置。這意味着,爲了保護某頁面中進行註銷用戶,你只需要包括以下內容:

if(!isset($_SESSION['user'])) header("Location: main_login.php"); 

你也應該保護你的登錄頁面的登錄用戶,使他們無法登錄,而已經是登錄:

if(isset($_SESSION['user']) && $_GET['action'] !== 'logout') header("Location: index.php") 

這假定您在登錄頁面上使用查詢字符串來確定用戶是否正在嘗試登錄或註銷。如果登錄的訪問者想要註銷,他們將在他們的url中登錄login.php?action =註銷,因此將被允許註銷。如果沒有,他們將被阻止訪問登錄頁面,因爲他們已經登錄,並直接發送到index.php(或任何您的保護部分)。

如果您的登錄頁面與您的註銷頁面分離,則根本不需要$ _GET條件。

0

取消設置變量「名爲myUsername」使用session_unset()

0

實際上有兩個問題......一個是,頁面可以在瀏覽器中緩存;第二個是該頁面可能被緩存在服務器上。實際上更可能是第一個。最好的方法是在頁面部分使用Pragma:NoCache:no-cache(IIRC,您需要聲明;一個用於HTTP1.0,另一個用於HTTP1.1,並且需要不同的語句)。你需要把它放在只能登錄的頁面上(或者至少是最敏感的頁面)。這將導致瀏覽器返回到服務器。

另一種是服務器緩存,實際上,它的可能性很小 - 如果你或者說Zend優化器做了一些緩存,你可能會知道。爲此,您可以使用session_unset或session_is_registered。但先試試Pragma。

0

某些瀏覽器還會保留網頁,以便在您點擊後退按鈕時立即「加載」。你有沒有嘗試過任何其他瀏覽器。

0

第1頁: 而登錄創建一個會話變量用戶

喜歡: 在session_start(); $ _SESSION ['user'] = $ userId;

第2頁: 當註銷未設置這個會話變量也

session_unregister(用戶);或未設置($ _ SESSION ['user']);

第3頁: 在剩餘的網頁,只想要登錄的用戶,使用這種類型的檢查

如果(isset($ _ SESSION [ '用戶'])!) { 標題(」位置:loginPage.php「); exit(); }

3

php.net : session destroy

session_destroy(另一個信息小珍聞)銷燬所有與當前會話相關聯的數據。它不會取消設置與會話關聯的任何全局變量,也不會取消設置會話Cookie。要再次使用會話變量,必須調用session_start()。

爲了完全消滅會話,就像登錄用戶一樣,會話ID也必須取消設置。如果使用cookie傳播會話標識(默認行爲),則必須刪除會話cookie。 setcookie()可用於此目的。