我正在使用PHP登录脚本来挑战用户的用户名&密码。
经过身份验证的程序会存储会话值。注销时,会话值为 设置为空白。
以下是问题:
在IE 8(不是Firefox)中,用户可以多次按回按钮直到 屏幕显示“网页已过期”消息。这可能是登录屏幕。
如果他按下F5,看起来用户名和密码仍然存在 在POST变量中他会重新登录。
答案 0 :(得分:0)
听起来您实际上并没有删除服务器上的会话,而是清除客户端上URL(或其他内容)中的sessionID。因此,当按下后退按钮时,它会尝试重新提交sessionid,并且您的服务器正在接受它。
OR
页面只是由客户端缓存,当他们按下时,它从缓存加载。当他们强制刷新时,它会重新加载没有变量的页面。
答案 1 :(得分:0)
您将需要执行基于会话的验证程序来解决此问题。您使用随机验证器字符串将隐藏字段传递给您的登录表单。将随机字符串存储在会话中,并使用重新发布的隐藏字段来验证此标识符。确认登录后重新生成验证程序,以便下次发布表单时验证程序不正确,后退按钮发布不起作用。
答案 2 :(得分:0)
发布登录表单并验证/登录/所有内容后,执行header('location:someOtherPage.php)
重定向到其他页面。然后按f5将无法重新发布表单。例如:
//login.php
<?php
//no cache headers if you want.
session_start();
if(isset($_POST) && !empty($_POST)){
//validate user & pass. if valid set session then...
if(is_valid_user()){
//set session
$_SESSION['loggedIn'] = true;
//close session. this prevents problems with vars not
//setting when using a header redirect because you redirect
//before the session file can write.
session_write_close();
//redirect to another page
header('location:loggedIn.php');
//stop the script from running
exit;
} else {
echo "<div class='error'>Login failed.</div>";
}
}
//echo login form.
?>
标题重定向未显示在历史记录中,因此当按下它们时,它们将看不到允许您重新发布表单的页面。