PHP SESSIONS, COOKIES and Remember Me function


PHP SESSIONS, COOKIES and Remember Me function

我有下面的代码,当用户登录时,他们会看到两个文本框和一个复选框。

设置三个cookie, username, passwordremember都可以工作,并且登录脚本本身完全可以(我很欣赏在cookie中存储散列密码不是最佳实践,但现在它会这样做)。

发生的情况是,当用户重新访问login.php页面(这个页面)时,当他们已经登录时,cookie将被逐一删除,因为没有满足$_POST条件,因此正在执行下面的行。我怎样才能防止这种情况发生呢?此外,任何关于清理代码的建议,因为我无疑会以大量重复的代码结束,我将不胜感激。由于

snippet from the 'login.php' page below

} elseif (!$_POST['remember']) {
    $past = time() - 100;
    if (isset($_COOKIE['remember'])) {
        setcookie('remember', '', $past);
    } elseif (isset($_COOKIE['username'])) {
        setcookie('username', '', $past);
    } elseif (isset($_COOKIE['password'])) {
        setcookie('password', '', $past);
    }
}

login.php

<?php
session_start();
include("includes/config.php");
?>
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
<?php
$odb = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
$username = "";
$password = "";
if (isset($_COOKIE['username']) && isset($_COOKIE['password'])) {
    $username = $_COOKIE['username'];
    $password = $_COOKIE['password'];
} elseif (isset($_POST['username'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $password = md5(DB_SALT.$password);
}
$sql = "SELECT * from tblMembers WHERE username = :username";
$query = $odb->prepare($sql);
$query->execute(array(":username" => $username));
$results = $query->fetchAll();
if($results !== FALSE && $query->rowCount()>0) {
    if($results[0]['passwordHash'] == $password) {
        $_SESSION['username'] = $username;
        $_SESSION['userID'] = $results[0]['userID'];
        if($_POST['remember']) {
            $month = time() + (60 * 60 * 24 * 30);
            setcookie('remember', $_POST['username'], $month);
            setcookie('username', $_POST['username'], $month);
            setcookie('password', $results[0]['passwordHash'], $month);
        } elseif (!$_POST['remember']) {
            $past = time() - 100;
            if (isset($_COOKIE['remember'])) {
                setcookie('remember', '', $past);
            } elseif (isset($_COOKIE['username'])) {
                setcookie('username', '', $past);
            } elseif (isset($_COOKIE['password'])) {
                setcookie('password', '', $past);
            }
        }

        header("Location: "."index.php");
    } else {
        echo "password incorrect";
    }
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
Username:&nbsp;
<?php
if(isset($_COOKIE['username'])) {
    echo "<input type='"text'" id='"username'" name='"username'" maxlength='"40'" value=".$_COOKIE['username'].">";
} else {
    echo "<input type='"text'" id='"username'" name='"username'" maxlength='"40'" value='"'">";
}
?>
Password:&nbsp;<input type="password" id="password" name="password" maxlength="50">
Remember Me:&nbsp;
<?php
if(isset($_COOKIE['remember'])) {
    echo "<input type='"checkbox'" id='"remember'" name='"remember'" checked='"checked'">";
} else {
    echo "<input type='"checkbox'" id='"remember'" name='"remember'">";
}
?>
<input type="submit" id="submit" name="submit" value="Log In">
</form>
</body>
</html>

您的代码确切地说明了这应该发生。在第一次请求之后,将不再设置remember POST参数,因此if语句的计算结果为true。然后,它将删除第一个cookie。下次它会删除第二个,因为第一个已经不存在了。

也许你应该替换这一行:

elseif (!$_POST['remember']) {
与这个:

elseif (!$_POST['remember'] && !$_COOKIE['remember']) {

您应该去掉那里的elseif s,因为您可能想要删除所有cookie。只要输入if,它就会像你希望的那样。

并且在旁注:!$var不是检查值是否设置的正确方法。使用!isset($var)代替。