0

我正在使用一个 PHP 登录脚本,该脚本向用户询问用户名和密码。

一旦经过身份验证,程序就会存储一个会话值。注销时,会话值设置为空白。

这是问题所在:

在 IE 8(不是 Firefox)中,用户可以多次点击返回按钮,直到屏幕显示“网页已过期”消息。这可能是登录屏幕。

如果他按 F5,看起来用户名和密码仍然在 POST 变量中徘徊,他会重新登录。

4

3 回答 3

0

听起来您实际上并没有删除服务器上的会话,而是清除了客户端 URL(或其他内容)中的 sessionID。因此,当按下后退按钮时,它会尝试重新提交传递的 sessionid 并且您的服务器正在接受它。

或者

页面只是被客户端缓存,当他们按下时,它会从缓存中加载。当他们强制刷新时,它会重新加载没有变量的页面。

于 2010-07-27T21:46:53.360 回答
0

您将需要做一个基于会话的验证器来解决这个问题。您将带有随机验证字符串的隐藏字段传递给您的登录表单。将随机字符串存储在会话中,并使用重新发布的隐藏字段来验证此标识符。确认登录后重新生成验证器,以便下次发布表单时验证器不正确并且后退按钮发布不起作用。

于 2010-07-27T21:49:03.853 回答
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.

?>

标题重定向不会显示在历史记录中,因此当按下返回时,他们将看不到允许您重新发布表单的页面。

于 2010-07-27T22:58:27.077 回答