我正在使用一个 PHP 登录脚本,该脚本向用户询问用户名和密码。
一旦经过身份验证,程序就会存储一个会话值。注销时,会话值设置为空白。
这是问题所在:
在 IE 8(不是 Firefox)中,用户可以多次点击返回按钮,直到屏幕显示“网页已过期”消息。这可能是登录屏幕。
如果他按 F5,看起来用户名和密码仍然在 POST 变量中徘徊,他会重新登录。
我正在使用一个 PHP 登录脚本,该脚本向用户询问用户名和密码。
一旦经过身份验证,程序就会存储一个会话值。注销时,会话值设置为空白。
这是问题所在:
在 IE 8(不是 Firefox)中,用户可以多次点击返回按钮,直到屏幕显示“网页已过期”消息。这可能是登录屏幕。
如果他按 F5,看起来用户名和密码仍然在 POST 变量中徘徊,他会重新登录。
听起来您实际上并没有删除服务器上的会话,而是清除了客户端 URL(或其他内容)中的 sessionID。因此,当按下后退按钮时,它会尝试重新提交传递的 sessionid 并且您的服务器正在接受它。
或者
页面只是被客户端缓存,当他们按下时,它会从缓存中加载。当他们强制刷新时,它会重新加载没有变量的页面。
您将需要做一个基于会话的验证器来解决这个问题。您将带有随机验证字符串的隐藏字段传递给您的登录表单。将随机字符串存储在会话中,并使用重新发布的隐藏字段来验证此标识符。确认登录后重新生成验证器,以便下次发布表单时验证器不正确并且后退按钮发布不起作用。
在您发布登录表单并验证/登录/一切后,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.
?>
标题重定向不会显示在历史记录中,因此当按下返回时,他们将看不到允许您重新发布表单的页面。