2010-04-08 108 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()可用于此目的。