2017-08-09 3 views
-2

Ich habe ein Problem mit meinem Login der Login funktioniert es prüft die HTML-Formulare und es ist die Info ist korrekt, es wird mich auf der eingeloggten Seite anmelden.Ich setze den Benutzernamen und die Benutzer-ID auf der Anmeldeseite Nachdem die Informationen überprüft wurden, scheint der Server die Informationen nicht zu speichern. Merkwürdige ist, wenn ich dann die Anmelde die Website funktioniert verwenden abzumelden Register der Benutzername usw. auf dem Login prüfe ich die Informationen dann den Benutzernamen in eine Variable dann tunSitzung speichert keine Variablen

if(empty($_SESSION['username'])) 
{ 
    echo "Somthing went wrong"; 
    echo '<META HTTP-EQUIV="Refresh" Content="0; URL=logout.php">'; 
} 

Aber dies wieder nicht auslösen, wenn ich gehe zu die Seite zum ersten Mal in einer Weile muss ich die Abmeldeseite anzeigen, bevor ich mich abmelden kann, selbst wenn ich nicht angemeldet bin, die Abmeldung zerstört natürlich nur die Sitzung.

if (isset($_POST["Username"]) && !empty($_POST["Username"])) {      

    $salt= ""; 

    $username23 = mysql_real_escape_string($_POST['Username']); 
    $thereusername = strip_tags($username23); 

    $password2= sha1 ($salt.$_POST["password"]); 

    $statement = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ? "); 
    $statement->execute(array($thereusername,$password2)); 
    $count = $statement->rowCount(); 

    /// If usernam and password match we carry on 
    if ($count == "1"){ 

     $username23 = mysql_real_escape_string($_POST['Username']); 
     $thereusername = strip_tags($username23); 

     $statement8 = $db->prepare("SELECT * FROM users WHERE username = ? "); 
     $statement8->execute(array($thereusername)); 
     $count8 = $statement8->fetch(); 

     $username233 = mysql_real_escape_string($count8['id']); 
     $_SESSION['userid'] = strip_tags($username233); 



     $_SESSION['username'] = $thereusername ; 



     if(empty($_SESSION['username'])){ 

      echo "Somthing went wrong"; 
      echo '<META HTTP-EQUIV="Refresh" Content="0; URL=logout.php">'; 
     } 

     if(empty($_SESSION['userid'])) 
     { 
      echo "Somthing went wrong"; 
      echo '<META HTTP-EQUIV="Refresh" Content="0; URL=logout.php">'; 
     } 

     echo "You are now being logged in"; 

     echo '<META HTTP-EQUIV="Refresh" Content="0; URL=dashboard.php">';  
     exit; 

     echo "works"; 

    } 
}; 
?> 

.

<form action="login.php" method="post"> 
    <div class="row"> 
     <div class="form-group col-sm-6"> 
      <label for="exampleInputEmail1">Username</label> 
      <input class="form-control" type="text" value="Artisanal kale" name= "Username" id="Username"> 
     </div> 

     <div class="form-group col-sm-6"> 
      <label for="exampleInputPassword1">Password</label> 
      <input type="password" class="form-control" name= "password" id="password"placeholder="Password"> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-sm-4"> 
      <p>  <input type="submit" value="Submit" class="btn theme-btn"> </p> 
     </div> 
    </div> 
</form> 

ich natürlich ganz oben auf der Seite der Sitzungsstart verwenden, nachdem ich es mir in Seite protokollierten anmelden nimmt aber nicht angezeigt ive den Benutzernamen oder irgendwelche Informationen print_r Sitzung durchgeführt und Array get() i dann gehen Sie zu logout.php und login und alles funktioniert perfekt Serverfehler oder PHP-Fehler?

+3

1. Mischen Sie nicht mysql und PDO. 2. Schreiben Sie nicht Ihre eigene Passwort-Hash-Logik, verwenden Sie stattdessen 'password_hash()'. 3. Starten Sie Ihr Skript mit 'session_start()'. – jeroen

+0

session_start() ist am Anfang der Seite :) wurde immer gesagt, um es an die Spitze vor allem hinzuzufügen – shadow

+0

Ich finde es seltsam, dass ich die Session abmeldet/destory und alles funktioniert gut – shadow

Antwort

0

Zunächst einmal, machen Sie kein eigenes Passwort salt/encrypt, müssen Sie verwenden, um Passwort-Hashes und password_verify() (oder bcrypt äquivalent) zu überprüfen, um das Hash-Passwort vs übergebenes Passwort zu überprüfen. Zweitens, wie bereits erwähnt, müssen Sie ausschließlich PDO verwenden. Zu guter Letzt müssen Sie einige Klassen erstellen, um Ihr Skript leichter zu verwalten und einfacher zu behandeln. Dies ist komplexer, da viele Teile implementiert werden müssen, aber dies ist ein grundlegendes Beispiel dafür, wo Sie mit Ihrem Login und so weiter gehen sollten. Ich würde empfehlen, wenn Sie die Mehrheit davon nicht verstehen, sollten Sie wahrscheinlich ein Framework herunterladen, weil diese Art von Sache komplex ist, um es richtig zu machen. Frameworks haben dies in allen gebaut, man muss nur die oberste Ebene des Skripts programmiert werden müssen, zum größten Teil ...

/core/classes/App.php

class App 
    { 
     # Storage of global arrays 
     protected static $GlobalArray = array(); 
     # Returns post trimmed POST array 
     public function getPost($key=false) 
      { 
       if(!isset(self::$GlobalArray['_POST'])) 
        self::$GlobalArray['_POST'] = $this->sanitizeArray($_POST); 

       if(!empty($key)) 
        return (isset(self::$GlobalArray['_POST'][$key]))? self::$GlobalArray['_POST'][$key] : false; 

       return self::$GlobalArray['_POST']; 
      } 
     # Trims the values 
     public function sanitizeArray($array) 
      { 
       if(!is_array($array)) 
        return trim($array); 

       foreach($array as $key => $value) { 
        $array[$key] = $this->sanitizeArray($value); 
       } 

       return $array; 
      } 
    } 

/Kern/classes/User.php

class User extends App 
    { 
     private $con; 
     public function __construct(\PDO $con) 
      { 
       $this->con = $con; 
      } 

     public function savePassword($username,$password) 
      { 
       # Create the password hash 
       $hash = password_hash($password); 
       # Prepare the query and store password hash 
       $query = $this->con->prepare("UPDATE users SET `password` = ? WHERE `username` = ?"); 
       $query->execute(array($username,$password)); 

       return $this; 
      } 

     public function validateUser($username,$password) 
      { 
       # Prepare the query to get the user 
       $query = $this->con->prepare("SELECT * FROM users WHERE `username` = ? LIMIT 1"); 
       $query->execute(array($username)); 
       # Assign password 
       $user = $query->fetch(\PDO::FETCH_ASSOC); 
       if(empty($user['password'])) 
        return false; 
       # Match hash to password 
       if(!password_verify($password,$user['password'])) 
        return false; 
       # Return the user data 
       return $user; 
      } 
    } 

/core/classes/Session.php

class Session extends App 
    { 
     public function toSession($array) 
      { 
       foreach($array as $key => $value) { 
        $_SESSION[$key] = $value; 
       } 
      } 
     # Save to errors array 
     public function toError($array) 
      { 
       foreach($array as $key => $value) { 
        $_SESSION['errors'][$key] = $value; 
       } 
      } 
     # Get error 
     public function getError($key=false) 
      { 
       if(!empty($key)) 
        return (isset($_SESSION['errors'][$key]))? $_SESSION['errors'][$key] : false; 

       return (isset($_SESSION['error']))? $_SESSION['error'] : false; 
      } 
     # Get value 
     public function get($key=false) 
      { 
       if(!empty($key)) 
        return (isset($_SESSION[$key]))? $_SESSION[$key] : false; 

       return (isset($_SESSION))? $_SESSION : false; 
      } 

     public function start() 
      { 
       session_start(); 
      } 

     public function destroy($key=false) 
      { 
       if(!empty($key)) { 
        if(isset($_SESSION[$key])) { 
         $_SESSION[$key] = null; 
         unset($_SESSION[$key]); 
        } 
       } 
       else { 
        session_destroy(); 
       } 
      } 
    } 

/config.php

# Create important defines 
define('DS',DIRECTORY_SEPARATOR); 
define('ROOT_DIR',__DIR__); 
define('CORE',ROOT_DIR.DS.'core'); 
define('CLASSES',CORE.DS.'classes'); 
define('FUNCTIONS',ROOT_DIR.DS.'functions'); 
# A class autoloader is a must... 
spl_autoload_register(function($class){ 
    $path = str_replace(DS.DS,DS,CLASSES.DS.str_replace('\\',DS,$class).'.php'); 
    if(is_file($path)) 
     include_once($path); 
}); 
# Include connection 
include(FUNCTIONS.DS.'functions.php'); 
# Create connection 
$db = mysqlconnect(); 
# Start the session 
$Session = new Session(); 
$Session->start(); 

/login.php

# Add our config file 
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php'); 
# Create application 
$App = new User($db); 
# Check if submission login 
if(!empty($App->getPost("Username"))) { 
    # Get the user array (returns on validated) 
    $User = $App->validateUser($App->getPost("Username"),$App->getPost("password")); 
    # If user is valid 
    if($User){ 
     $Session->toSession(array(
      'userid'=>$User['id'], 
      'username'=>$User['username'] 
     )); 
     # Redirect & stop 
     header('Location: dashboard.php'); 
     exit; 
    } 
    else { 
     # Store the error 
     $Session->toError(array("invalid_login"=>"Invalid username or password")); 
     # Redirect to error or whatever... 
    } 
} 

Ich habe nicht wirklich diese Option aktiviert ist, aber ich habe festgestellt, so dass Sie wissen, was was bedeutet (oder soll es tun). Sie möchten die config.php immer aus Gründen der Konsistenz oben auf jeder Seite der obersten Ebene einfügen.

Verwenden Sie print_r($Session->get());, um das Sitzungsarray zu sehen. Beachten Sie auch, dass die Passwortprüfung nicht funktioniert, wenn Sie den Passwort-Hash nicht richtig gespeichert haben.