php中的注销脚本问题

时间:2010-04-08 05:16:32

标签: php mysql html

我是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");
}
?>

我建议你做什么,当用户点击后退按钮时,脚本会提示再次输入用户名和密码。

6 个答案:

答案 0 :(得分:3)

来自php.net : session destroy

的另一小撮信息
  

session_destroy()会销毁与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话cookie。要再次使用会话变量,必须调用session_start()。

     

为了完全终止会话,要将用户注销,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。 setcookie()可能会用于此。

答案 1 :(得分:0)

使用session_unset()

取消设置变量“myusername”

答案 2 :(得分:0)

实际上存在两个问题......一个是页面可能在浏览器中缓存;第二个是页面可以缓存在服务器上。实际上更可能是第一个。最好的方法是在页面部分使用Pragma:NoCache:no-cache(IIRC,你需要声明;一个用于HTTP1.0,一个用于HTTP1.1,它们需要不同的语句)。您需要将其放在仅可登录的页面上(或至少是最敏感的页面)。这将导致浏览器返回服务器。

另一个是服务器缓存,实际上不太可能 - 你可能知道你或者Zend优化器是否做了一些缓存。为此,您可以使用session_unset或session_is_registered。但首先尝试Pragma。

答案 3 :(得分:0)

某些浏览器还会保留网页,以便在您单击后退按钮时立即“加载”。你有没有尝试过任何其他浏览器

答案 4 :(得分:0)

第1页: 登录时为用户创建会话变量

像: 在session_start(); $ _SESSION [ '用户'] = $用户id;

2页: 注销时取消设置此会话变量

session_unregister(用户);或取消设置($ _ SESSION ['user']);

第3页: 在您只想登录用户的其余页面上,使用此类检查

如果(!isset($ _ SESSION [ '用户'])) { header(“Location:loginPage.php”); 出口(); }

答案 5 :(得分: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 = logout,因此将允许注销。如果没有,他们将被阻止访问登录页面,因为他们已经登录,并被直接发送到index.php(或受保护部分的任何地方)。

如果您的登录页面与您的注销页面分开,则根本不需要$ _GET条件。