2017-08-26 3 views
2

Ich versuche, meine Sicherheit zu verbessern, indem ich password_hash und PDO vorbereitete Anweisungen verwende, um SQL Injection zu verhindern. Ich habe bereits mit MySQLi OOP und Procedural gearbeitet. Ich versuche, auf PDO umzusteigen und möchte lernen. So habe ich ein Anmeldeformular mit PDO erstellt, das bereits funktioniert und die Verschlüsselung des Passworts funktioniert auch. Aber wenn ich mich selbst mit dem richtigen Benutzernamen und Passwort angemeldet habe, kann ich mich nicht anmelden.PHP register und login mit password_hash passwort default using pdo

Dies ist der Code, den ich verwende, um mein Passwort im Anmeldeformular zu hashen.

$password = $_POST['password']; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

Dann führe ich es mit vorbereiteten Anweisungen. Also keine Fehler, hier funktioniert alles gut.

Aber als ich versuchte, mich anzumelden, wird es mich nicht auf die Zielseite umleiten, wo es sein sollte.

So, hier ist der Code Anmeldungs ​​

<?php 
session_start(); 
$host = "localhost"; 
$username = "root"; 
$password = ""; 
$database = "PDOtesting"; 
$message = ""; 
try 
{ 
     $connect = new PDO("mysql:host=$host; dbname=$database", $username, $password); 
     $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     if(isset($_POST["login"])) 
     { 
      if(empty($_POST["username"]) || empty($_POST["password"])) 
      { 
       $message = '<label>All fields are required</label>'; 
      } 
      else 
      { 
       $query = "SELECT * FROM users WHERE username = :username AND password = :password"; 
       $statement = $connect->prepare($query); 
       $statement->execute( 
        array( 
          'username'  =>  $_POST["username"], 
          'password'  =>  $_POST["password"] 
        ) 
       ); 
       $count = $statement->rowCount(); 
       if($count > 0) 
       { 
        $_SESSION["username"] = $_POST["username"]; 
        header("location:login_success.php"); 
       } 
       else 
       { 
        $message = '<label>Wrong Data</label>'; 
       } 
      } 
     } 
} 
catch(PDOException $error) 
{ 
     $message = $error->getMessage(); 
} 
?> 

Soll ich auch die password_hash Funktion, dass ich es in der Anmeldung enthalten? und wo sollte ich den Code platzieren? Auf der Suche nach Hilfe. Vielen Dank im Voraus.

+0

Query-Benutzer von Benutzernamen nur; Holen Sie sich das Ergebnis Ihrer Abfrage und vergleichen Sie es mit der Funktion 'password_verify', wenn es funktioniert, lassen Sie es erfolgreich sein, sonst ist es nicht ...' password_hash' erzeugt jedes Mal ein anderes Passwort für die gleiche Zeichenfolge, wenn es zufälliges Salz erzeugt verwendet werden – ahmad

Antwort

4

Versuchen Sie nicht, das Kennwort in der Abfrage übereinzustimmen, wählen Sie den Benutzer aus, geben Sie zurück und verwenden Sie dann password_verify für das Ergebnis.

Update:

<?php 
... 
try 
{ 
     $connect = new PDO("mysql:host=$host; dbname=$database", $username, $password); 
     $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     if(isset($_POST["login"])) 
     { 
      if(empty($_POST["username"]) || empty($_POST["password"])) 
      { 
       $message = '<label>All fields are required</label>'; 
      } 
      else 
      { 
       $query = "SELECT * FROM users WHERE username = :username LIMIT 1"; 
       $statement = $connect->prepare($query); 
       $statement->execute( 
        array( 
          'username'  =>  $_POST["username"] 
        ) 
       ); 
       $count = $statement->rowCount(); 
       if($count > 0) 
       { 
        $result = $statement->fetch(); 

        //check password 
        if (password_verify($_POST["password"], $result['password'])) { 
         $_SESSION["username"] = $_POST["username"]; 
         exit(header("location:login_success.php")); 
        } else { 
         $message = '<label>Wrong Data</label>'; 
        } 
       } 
       else 
       { 
        $message = '<label>Wrong Data</label>'; 
       } 
      } 
     } 
} 
catch(PDOException $error) 
{ 
     $message = $error->getMessage(); 
} 
?> 
+0

wie diese? password_varify ($ _ POST ["password"], PASSWORD_DEFAULT) korrigiere mich, wenn ich falsch liege –

+0

Na 'password_varify ($ _ POST [" passwort "], $ result-> passwort)', '$ result-> password' wird gespeichert Hash in der Datenbank. –

+0

es wird nicht funktionieren für mich können Sie es genauso wie die Abfrage im Code? Sorry für die Störung :( –