2016-05-15 5 views
1

Ich habe eine sehr einfache PHP-Single-Seite, die den Benutzer erfordert, einen bestimmten Benutzernamen und Pass eingeben, um auf den Inhalt zugreifen. Es generiert ein Cookie, mit dem der Benutzer für einen Tag auf diese Seite zugreifen kann. Wenn der Benutzer angemeldet ist, wird die Inhaltsliste angezeigt. Ist dies nicht der Fall, wird das Formular angezeigt.PHP: Das Setzen der Sitzungsinformationen in einem Cookie wird nicht beibehalten, nachdem die Seite neu geladen wurde?

Es ist alles innerhalb einer einzigen index.php Seite.

Diese einzelne "geschützte" Seite enthält ein Formular, wo der Benutzer einige Informationen eingeben und speichern kann. Nachdem sich der Benutzer angemeldet hat, wird der gesamte Inhalt wie beabsichtigt angezeigt. Aber wenn der Benutzer versucht, dieses Formular zu senden und die Seite neu zu laden (der neue Inhalt sollte zu dieser Seite hinzugefügt werden), wird es rausgeschmissen und die im Formular enthaltenen Informationen gehen verloren, und es wird nicht gespeichert.

Dies sind die spezifischen Teile der Seite index.php:

<?php session_start(); ?> 
<!DOCTYPE html> 
[...] 

<?php 
if(isset($_POST['loguearse'])) { 
    $_SESSION['user']=strip_tags($_POST['user']); 
    $_SESSION['pass']=strip_tags($_POST['pass']); 
    if($_SESSION['user'] == 'myuser' && $_SESSION['pass'] == 'mypass') { 
     if (isset($_SESSION['user'])) { 
     session_start(); 
       setcookie ("usuario",$_POST['user'], time()+24*60*60); 
       setcookie ("clave",$_POST['pass'], time()+24*60*60); 
     } 

[hier geht es der Inhalt, OK funktioniert, wenn ich die Login-Kontrollstreifen]

} 
    } else { 
        setcookie("usuario",""); 
        setcookie("clave",""); 

     echo ' 
      <form method="post"> 
       <div class="form-group"> 
       <input type="text" class="form-control" name="user" id="user" placeholder="Usuario"> 
       </div> 
       <div class="form-group"> 
       <input type="password" class="form-control" name="pass" id="pass" placeholder="clave"> 
       </div> 
       </div> 
       <div class="modal-footer"> 
       <input type="submit" name="loguearse" class="btn btn-primary"> 
       </div> 
      </div> 
      </form> 
     '; 
     echo 'No puedes entrar sin poner la clave correcta!'; 
    } 
?> 

Meine Frage ist: Wie behalte ich diesen Benutzer angemeldet und mit einer aktiven Sitzung für 24 Stunden?

Antwort

1

Ihre Prüfauftrag ist das Problem hier. Sie testen ursprünglich die POST-Variable und nicht die SESSION-Variable. Versuchen Sie folgendes:

  1. Test zur Abmeldung, um zu sehen, ob die Benutzer abzumelden versucht. Wenn ja, löschen Sie die Sitzung.

  2. Test für die Session-Variablen, um anzuzeigen, sie in bereits angemeldet sind.

  3. IF 1 und 2 sind falsch, Test für die Anmeldung. Wenn dies der Fall ist, initialisieren Sie die Sitzung.

1

Es ist die Art, wie Sie Ihre If-Bedingungen konstruieren. Jedes Mal, wenn der Benutzer kein Post-Formular abschickt, überschreiben Sie den Cookie. Die Bedingung isset($_SESSION['user']) muss (zuerst) auf der höchsten Ebene sein und dann die Postformprüfung.

Auch Sie laufen zweimal session_start(), einmal ist genug.

1

Ich benutze dies für genau diese Sache und nur dies in den Kopf einer beliebigen Seite.

<?php 
@session_start(); 
// DB DEFINITIONS 
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/db.php'); 
$db = db_connect(); 

if(isset($_GET['logout'])){ 
    session_unset(); 
    session_destroy(); 
    if (isset($_COOKIE['cookuhash']) && isset($_COOKIE['cookfhash'])){ 
     setcookie("cookuhash", "", time()-2592000,"/"); 
     setcookie("cookfhash", "", time()-2592000,"/"); 
     $uhash=$db->real_escape_string($_COOKIE['cookuhash']); 
     $fhash=$db->real_escape_string($_COOKIE['cookfhash']); 
     $db->query("DELETE FROM tblsessions WHERE USER_HASH='$uhash' AND FORM_TOKEN='$fhash'"); 
    } 
    header("Location: /index.php"); 
    exit(); 
} 

if(!isset($_SESSION['loggedIn'])){ 
    $_SESSION['loggedIn']=false; 
    $_SESSION['username'] = 'Anonymous'; 
    $_SESSION['userid'] = 0; 
    $_SESSION['userlevel'] = 0; 
    $_SESSION['formToken'] = sha1(microtime()); 
} 

if (!$_SESSION['loggedIn'] && isset($_COOKIE['cookuhash']) && isset($_COOKIE['cookfhash'])){ 
    $uhash=$db->real_escape_string($_COOKIE['cookuhash']); 
    $fhash=$db->real_escape_string($_COOKIE['cookfhash']); 
    $result = $db->prepare("SELECT u.id,uname, lvl, user_lvl_expires FROM tblusers u LEFT JOIN tblsessions s ON s.USER_ID=u.ID WHERE USER_HASH='$uhash' AND FORM_TOKEN='$fhash'"); 
    $result->execute(); 
    $result->bind_result($id,$uname,$ads,$lvl,$expires); 
    $result->store_result(); 
    if($result->num_rows > 0){ 
     while ($result->fetch()) { 
      $_SESSION['loggedIn']=true; 
      $_SESSION['username'] = $uname; 
      $_SESSION['userid'] = $id; 
      $_SESSION['userlevel'] = $lvl; 
      $_SESSION['expires'] = $expires; 
      $_SESSION['formToken'] = sha1(microtime()); 
     } 
    } 
} 
?> 

dann in einer beliebigen Seite überprüfen gerade:

@session_start(); 
if((!isset($_SESSION['loggedIn']) || $_SESSION['loggedIn']==0) && !isset($_COOKIE['cookuhash'])){ 
    header("Location: /login.php"); 
    exit(); 
} 
Verwandte Themen