-1

次のコードがあります。ユーザーがログインすると、2 つのテキスト ボックスとチェックボックスが表示されます。

3 つの Cookie を設定すると、usernameすべてが機能し、ログイン スクリプト自体はまったく問題ありません (ハッシュ化されたパスワードを Cookie に保存することはベスト プラクティスではありませんが、今のところは可能です)。passwordremember

ただし、ユーザーlogin.phpが既にログインしているときにページ (このページ) に再度アクセスすると、$_POST 条件が満たされず、以下の行が実行されるため、Cookie が 1 つずつ削除されます。どうすればこれを防ぐことができますか。また、多くのコードが繰り返されることは間違いないため、コードをクリーンアップするための提案をいただければ幸いです。ありがとう

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>
4

1 に答える 1

2

あなたのコードは、これが起こるべきだと正確に言っています。最初のリクエストの後、rememberPOSTパラメータは設定されなくなるため、ifステートメントはに評価されtrueます。次に、最初のCookieを削除します。次回は、最初のものがもう存在しないため、2番目のものを削除します。

多分あなたはこの行を置き換える必要があります:

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

これとともに:

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

elseifそして、おそらくすべてのCookieを削除したいので、そこにあるsを取り除く必要があります。置くだけifで、思い通りに動作するはずです。

!$varちなみに、値が設定されているかどうかを確認する適切な方法ではありません。!isset($var)代わりに使用してください。

于 2013-02-26T13:19:04.623 に答える