2012-04-01 4 views
0

Ich mache ein Login-System mit PHP, und wenn ich die richtigen Informationen einreiche, ist es ein Cookie gesetzt. Die Formularaktion wird an die gleiche Seite gesendet, auf der oben eine Cookie-Bestätigung für das isset-Cookie vorhanden ist. Da Cookies jedoch nach ihrer Einrichtung aktualisiert werden müssen, müssen Sie die Seite ein weiteres Mal aktualisieren, damit Cookies erkannt werden.php: Setzen von Cookies und Abrufen von ihnen?

Was ist ein Workaround dafür? hier ist mein Code (wo Benutzername und Passwort „admin“ nur als Platzhalter ist. wenn ich das System zum Laufen zu bringen, werde ich Werte aus der Datenbank ziehen.)

<?php 
if(isset($_COOKIE['user'])) 
{ 
echo "Hello, administrator.<br />"; 
echo "<a href=?logout=yes>logout</a>"; 
if(isset($_GET['logout'])) 
{ 
    setcookie("user", $_POST['username'], time() - 3600); 
} 
} 
else 
{ 
if (isset($_POST['submit'])) 
{ 
    if (($_POST['username']=="admin")&&($_POST['password']=="admin")) 
    { 
      setcookie("user", $_POST['username'], time() + 3600); 
    } 
    else 
    { 
     echo "empty field or wrong user/pass."; 
    } 
} 
else 
{ 
    echo "nothing submitted. show form."; 
} 
} 
?> 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
<table border="0"> 
<tr><td colspan=2><h1>Login</h1></td></tr> 
<tr><td>Username:</td><td> 
<input type="text" name="username" maxlength="40"> 
</td></tr> 
<tr><td>Password:</td><td> 
<input type="password" name="password" maxlength="50"> 
</td></tr> 
<tr><td colspan="2" align="right"> 
<input type="submit" name="submit" value="Login"> 
</td></tr> 
</table> 
</form> 
+1

Sie erkennen, dass jeder ein potenzieller Administrator mit diesem Ansatz ist? Jeder kann in seinem Client einen Cookie namens 'user' setzen. –

+0

Ferhad, welche Methode schlagen Sie vor? Ich bin neugierig. – David

+0

Verwenden Sie die Sitzung für alle Benutzerdaten und den Cookie, um die Sitzungs-ID oder den Hash zu speichern. –

Antwort

0
$loggedin = false; 
if(isset($_POST['submit'])) { 
// Do login checking and set cookies 
$loggedin = true; // if the case 
}else if(isset($_COOKIE['username']) && isset($_COOKIE['password'])) { 
    // Check if valid login 
    $loggedin = true; // if the case 
}else{ 
    // They are not logged in. 
} 

dann den veriable $ loggedin verwenden, um Sehen Sie, ob sie eingeloggt sind. Ich schlage vor, dass Sie dafür eine Benutzerklasse erstellen, also verwenden Sie den gleichen Code immer und immer wieder in Ihren Dateien.

0

Sie können Ihre eigene Funktion machen Cookies zu setzen, das heißt:

function my_setcookie($name,$value,$expire){ 
    $_COOKIE[$name] = $value; 
    return setcookie($name,$value,$expire); 
} 

Aber bessere Idee ist es Benutzer nach erfolgreicher Anforderung ‚POST‘ umleiten, so dass, wenn die Seite aktualisiert wird, Browser beschweren sich nicht um POST-Daten erneut senden.

1

Sofern Sie nicht unbedingt ein benutzerdefiniertes Cookie verwenden müssen, würde ich stattdessen vorschlagen, $ _SESSION global zu verwenden. $ _SESSION-Daten sind verfügbar, sobald Sie sie festgelegt haben. Wichtiger ist jedoch, dass die Daten nicht auf dem Client gespeichert werden. Das bedeutet, dass der Benutzer niemals auf seine Daten zugreifen kann. Es ist also schwieriger, Ihr Login-System zu hacken. Mit einem Cookie kann jeder, wie andere darauf hingewiesen haben, die Daten lesen und bearbeiten!

session_start(); 

if (isset($_GET['logout'])) 
{ 
    unset($_SESSION['username']); 
} 
if ($_SESSION['username'] == 'admin') 
{ 
    echo "hello admin!"; 
} 
else if (($_POST['username']=="admin")&&($_POST['password']=="admin")) 
{ 
    $_SESSION['username'] = $_POST['username']; 
} 

Um das $ _SESSION Globals zu verwenden, Sie session_start() am Anfang des Skripts setzen müssen (bevor Sie das Senden von Daten). Es sollte Ihr Problem der Umleitung zur gleichen Zeit lösen. Beachten Sie, dass $ _SESSION hinter der Szene einen kleinen Cookie verwendet, aber Sie müssen nicht wirklich darüber nachdenken. Es enthält nur eine kleine ID.

Weitere Informationen zu Sitzung

http://www.php.net/manual/en/book.session.php

PS: Um ehrlich zu sein, würde ich immer noch hier eine Umleitung verwenden. Wenn Sie ein Formular POSTIEREN und die Zurück-Taste drücken, fordert der Browser Sie auf, die Daten erneut zu senden, und es ist ärgerlich. Verwenden Sie eine Umleitung mit header("Location: " . $newUrl); entfernen Sie diese Belästigung. Aber nur meine 2 Cent.

Verwandte Themen