PHP-SESSIONS, COOKIES und Remember Me Funktion
Ich habe den folgenden code, wenn ein Benutzer anmeldet, erhalten Sie zwei Textfelder und eine checkbox.
Einstellung der drei cookies username
, password
und remember
alle arbeiten und die log-in-Skript selbst ist comepletely in Ordnung (ich Schätze, dass die Speicherung von Hash-Passwörter im cookie ist nicht best practice, aber für jetzt, es zu tun).
Was passiert, ist id die Benutzer-re-Besuche die login.php
Seite (diese hier), während Sie bereits angemeldet sind die cookies entfernt werden, one-by-one wie die $_POST-Bedingung ist nicht erfüllt und daher die folgenden Zeilen ausgeführt werden. Wie kann ich verhindern, dass dies geschieht. Auch Anregungen, um den code bereinigen, so werde ich ohne Zweifel am Ende mit einer Menge von wiederholten code wird geschätzt. Dank
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:
<?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: <input type="password" id="password" name="password" maxlength="50">
Remember Me:
<?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>
- Wie dieser cookie-Frage ist mit mysql und PDO?
- Denn es enthält MySQL-und PDO-code, alle anderen Klassen, die ich habe sind im Zusammenhang mit diesem also habe ich gedacht, dass, wenn ich erreichen, um mehr Menschen dann bekomme ich eine maßgeschneiderte Antwort in Bezug auf das, was ich erzielen möchte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code sagt genau, dass dieses geschehen sollte. Nach der ersten Anfrage die
remember
POST-parameter nicht mehr und so ist die if-Anweisung wertettrue
. Dann löschen Sie die erste cookie. Das nächste mal wird es löschen Sie die zweite, weil die erste schon nicht mehr existiert.Vielleicht sollten Sie ersetzen Sie diese Zeile:
mit dabei:
Und Sie sollten loszuwerden, die
elseif
s drin, da Sie wahrscheinlich wollen, um alle cookies zu löschen. Setzen Sie einfachif
- und sollte es tun, wie Sie wünschen.And on a side note:
!$var
ist nicht der richtige Weg, um zu überprüfen, ob ein Wert gesetzt ist. Verwenden!isset($var)
statt.elseif (!isset($_POST['remember']) && (!isset($_COOKIE['remember'])))
!$_POST['remember']
mit anderen&&
den Zustand als gut. Stellen Sie sicher, dass dieisset()
wird immer geprüft, bevor Sie tatsächlich nutzen die variable.