Login-Formular - gehashte Passwörter vergleichen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Login-Formular - gehashte Passwörter vergleichen

    Hallo!

    Ich möchte in meinem Login-Formular durch Eingabe von Benutzername und Passwort die in der MySQL-Datenbank gespeicherten (hash) Passwörter mit password_verify vergleichen und bei korrekten Eingaben (Benutzer und Passwort) anschließend auf die mainpage.php weitergeleitet werden. Ich habe schon sehr viel herumprogrammiert, doch ich komme nicht weiter. Vielleicht kann mir jemand weiterhelfen.
    Über eure Hilfe bedanke ich mich jetzt schon mal.

    PHP-Code:
    <?php
     
    // Verbindung zur MySQL-Daten aufbauen
     
    $connect mysqli_connect("localhost""root""""users");
     
    session_start(); // Starting Session
     
    $error ''// Variable To Store Error Message
      
     
    if (isset($_POST['submit']))
     {
     if (empty(
    $_POST['username']) || empty($_POST['password']))
     
    $error "Username or Password is invalid";
     {
     echo 
    '<script>alert("Beide Felder sind erforderlich!")</script>';
     }
     else
     {
     
    // Definieren von $username and $Password
     
    $username mysqli_real_escape_string($connect$_POST['username']);
     
    $password mysqli_real_escape_string($connect$_POS['password']);
      
     
    // SQL-Abfrage zum Abfragen von Informationen registrierter Benutzer und Ermitteln der Benutzerübereinstimmung.
     
    $query "SELECT * FROM login WHERE username = '$username'";
     
    $result mysqli_query($connect$query);
     if(
    mysqli_num_rows($result) > 0)
     {
     while(
    $row mysqli_fetch_array($result))
     {
     if(
    password_verify($password$row['password']))
     {
     
    //return true;
     
    $_SESSION["login_user"] = $username;
     
    header("location:mainpage.php");
     }
     else
     {
     
    // return false;
     
    echo '<script>alert("Falsche Benutzer Daten")</script>';
     }
     }
     }
     else
     {
     echo 
    '<script>alert("Falsche Benutzer Daten")</script>';
     } 
     }
     }
     
    mysqli_close($connect); // Closing Connection
     
    ?>

  • #2
    Hey romae,


    vielen Danke erstmal das du dich an dieses Forum gewendet hast. Dein Ansatz ist aufjedenfall nicht ganz falsch, jedoch solltest du einige Sachen beachten.



    Du hast nicht dein kompletten Script gepostet aber ich versuche dir trotzdem ein Hilfestellung zu geben.


    Soweit scheint alles in ordnung zu sein:


    PHP-Code:
    <?php
     
    // Verbindung zur MySQL-Daten aufbauen
     
    $connect = new mysqli("localhost""root""""users");
     
    session_start(); // Starting Session
     
    $error ''// Variable To Store Error Message

    Danach hast du eine Abfrage gemacht ob der Formular gesendet worden ist, dafür hast du eine alten PHP Code benutzt und diesen kannst du mithilfe von filter_input erledigen.


    also z.B so:


    PHP-Code:
    if(filter_input(INPUT_POST"abgesendet") == "abgesendet") {//Formular ist abgesendet worden


    Hier in diesem Fall steht "abgesendet" für den submit namen und "abgesendet" steht für die value die du in type submit geschrieben hast.


    Die zweite abfrage kannst du dir von nun an sparen, denn dank HTML5 kannst du einen Formularfeld mithilfe von HTML5 code überprüfen ob es leer ist und dies machst du mithilfe von required oder required="required"


    Ein Beispiel dazu:


    HTML-Code:
    <input type="text" name="benutztername" placeholder="Benutzername" required="required">

    Du fügst es ganz am ende in den input-Tag ein und somit musst du keine extra kontrolle bei PHP machen, damit kannst du dir code sparen.


    Als nächstes hast du die Zuweisung von benutzernamen und kennwort gemacht, hier sieht soweit alles in ordnung bis auf $_POST, dies bitte mit filter_input ersetzen bitte.


    Anschließend kommen wir zu der Tabellenabfrage dort kannst du auch einiges verändern, dies ist natürlich nur ein vorschlag:


    PHP-Code:
    $query $connect->query(""SELECT id,password FROM login WHERE username '$username'");
    $dt = $query->fetch_assoc();
    if(
    $dt["id"] > 0) {  
        if(password_verify(
    $password$dt["password"])) {
             
    $_SESSION["login_user"] = $dt["id"];
             header("
    location:mainpage.php");
        }    else {         
            echo '<script>alert("
    Falsche Benutzer Daten")</script>';
        }

    }
    else {
        
        echo '<script>alert("
    Falsche Benutzer Daten")</script>';


    Ich gehe davon aus, da dies nur logisch ist das es nur einen Benutzernamen gibt, der zu einem Kennwort passt, deswegen hab ich den Row schon vor den Abfragen gemacht.


    Bei mysqli habe ich die OOP Version benutzt, ist geschmackssache.


    Falls du es noch nciht ausprobiert hast, würde ich dir empfehlen einen Debug durchzuführen.


    Ich mache das immer so das ich immer zwischen den einzelnen abfragen, einen echo Befehl einbaue, um zu schauen wie weit es geht, in dem echo schreibe ich einfach hallo oder sonstiges.



    Versuche bitte soweit wie möglich dein code nach einem bestimmten standard zu coden, da dies die Übersicht verbessert und somit kannst du Fehler schneller identifizieren.


    Beim Session habe ich nicht den eingegebenen Benutzernamen sondern die ID des Benutzers gespeichert, das sollte dir in deinem weiteren Script sicherlich weiterhelfen, statt den benutzernamen zu speichern.


    Ich hoffe ich konnte dir behilflich sein.




    Wichtiger Notiz:


    Dieses Script wurde nicht getestet und somit gebe ich kein Gewähr. Bitte achte darauf das dies nur Vorschläge sind, den es gibt mehrere wege zur Lösung. Sollten noch irgendwelchen Fragen offen sein, kannst du es sehr gerne hier stellen.


    Mit freundlichen Grüßen



    Flavaslava

    Kommentar


    • #3
      Danke soweit.

      Die index.php lautet wie folgt:

      PHP-Code:
      <?php
         
      include('login.php'); // Includes Login Script
         
         
      if(isset($_SESSION['login_user'])){
            
      header("location: mainpage.php"); // Redirecting To Profile Page
         
      }
      ?>
       <!DOCTYPE html>
      <html>
      <head>
         <title>Login Form in PHP with Session</title>
         <link href="style.css" rel="stylesheet" type="text/css">
      </head>
      <body>
         <div id="login">
         <h2>MASSAGESTUDIO</h2>
         <form action="" method="post">
         <label>Benutzername :</label>
         <input id="name" name="username" placeholder="Benutzername" type="text">
         <label>Passwort :</label>
         <input id="password" name="password" placeholder="**********" type="password"><br><br>
         <input name="submit" type="submit" value=" Login ">
         <span><?php echo $error?></span>
      </form>
      </div>
      </body>
      </html>

      Kommentar


      • #4
        Nun habe ich versucht, den Code an deine Vorgaben anzupassen, doch leider komme ich immer noch nicht weiter.

        Habe ich den Code korrekt nach deinen Vorgaben geschrieben?

        PHP-Code:
        <?php
           
        // Verbindung zur MySQL-Daten aufbauen
           
        $connect mysqli_connect("localhost""root""""users");
           
        session_start(); // Starting Session
           
        $error ''// Variable To Store Error Message
            
        if(filter_input(INPUT_POST"submit") == "Login"
           {
              
        //Definieren von $username and $password
              
        $username mysqli_real_escape_string($connectfilter_input['username']);
              
        $password mysqli_real_escape_string($connectfilter_input['password']);
               
        // SQL-Abfrage zum Abfragen von Informationen registrierter Benutzer und Ermitteln der Benutzerübereinstimmung.
              
        $query $connect->query("SELECT id,password FROM login WHERE username = '$username'");
              
        $dt $query->fetch_assoc();
              if(
        $dt["id"] > 0) {  
                 if(
        password_verify($password$dt["password"])) {
                    
        $_SESSION["login_user"] = $dt["id"];
                    
        header("location:mainpage.php");
               }    else {         
                    echo 
        '<script>alert("Falsche Benutzer Daten")</script>';
               }
             }
            else {
            
               echo 
        '<script>alert("Falsche Benutzer Daten")</script>';
           } 
           
           }
           
        mysqli_close($connect); // Closing Connection
        ?>

        Kommentar


        • #5
          welche Fehlermeldung kriegst du denn ganz genau?


          versuch es mal so bitte:


          PHP-Code:
           <?php
             
          // Verbindung zur MySQL-Daten aufbauen
             
          $connect = new mysqli("localhost""root""""users");
             
          session_start(); // Starting Session
             
          $error ''// Variable To Store Error Message
              
          if(filter_input(INPUT_POST"submit") == "Login"
             {
                
          //Definieren von $username and $password
                
          $username filter_input(INPUT_POST'username');
                
          $password filter_input(INPUT_POST'password');
                 
          // SQL-Abfrage zum Abfragen von Informationen registrierter Benutzer und Ermitteln der Benutzerübereinstimmung.
                
          $query $connect->query("SELECT id,password FROM login WHERE username = '$username'");
                
          $dt $query->fetch_assoc();
                if(
          $dt["id"] > 0) {  
                   if(
          password_verify($password$dt["password"])) {
                      
          $_SESSION["login_user"] = $dt["id"];
                      
          header("location:mainpage.php");
                 }    else {         
                      echo 
          '<script>alert("Falsche Benutzer Daten")</script>';
                 }
               }
              else {
              
                 echo 
          '<script>alert("Falsche Benutzer Daten")</script>';
             } 
             
             }

          ?>

          und den formular so zu nutzen:




          PHP-Code:
          <?php
             
          include('login.php'); // Includes Login Script
             
             
          if(isset($_SESSION['login_user'])){
                
          header("location: mainpage.php"); // Redirecting To Profile Page
             
          }
          ?>
           <!DOCTYPE html>
          <html>
          <head>
             <title>Login Form in PHP with Session</title>
             <link href="style.css" rel="stylesheet" type="text/css">
          </head>
          <body>
             <div id="login">
             <h2>MASSAGESTUDIO</h2>
             <form method="post">
             <label>Benutzername :</label>
             <input id="name" name="username" placeholder="Benutzername" type="text" required="required">
             <label>Passwort :</label>
             <input id="password" name="password" placeholder="Kennwort" type="password" required="required"><br><br>
             <input name="submit" type="submit" value="Login">
             <span><?php echo $error?></span>
          </form>
          </div>
          </body>
          </html>



          Mfg
          Flava

          Kommentar


          • #6
            Hallo Flava!

            Danke für die Hilfestellung!

            Ich erhalte keine Fehlermeldung, sondern es erscheint die Meldung, dass das Passwort nicht korrekt ist, obwohl ich weiß, dass ich das richtige Passwort eingetragen habe.

            Über folgenden Code erstelle ich verschlüsselte Passwörter:
            PHP-Code:
            <!DOCTYPE html><html><head><meta charset="utf-8">
            <?php
               
            if (isset($_POST["gesendet"]))
               {
                  
            $con mysqli_connect("localhost""root""""users");
                   
            // Verbindungsüberprüfung
                  
            if (mysqli_connect_errno()) {
                     echo 
            "Verbingungsaufbau zu MySQL klappt nicht!: " mysqli_connect_error();
                  }
                   
            $vorname mysqli_real_escape_string($con$_POST['vorname']);
                  
            $nachname mysqli_real_escape_string($con$_POST['nachname']);
                  
            $passwort mysqli_real_escape_string($con$_POST['passwort']);
                  
            $username mysqli_real_escape_string($con$_POST['username']);
                  
            $email mysqli_real_escape_string($con$_POST['email']);
                  
            $datum mysqli_real_escape_string($con$_POST['datum']);
                   
            //Die Passwortverschlüsselung geschieht hier!
                  
            $pw 'passwort';
                  
            $passwort password_hash($pwPASSWORD_DEFAULT);
                   
            $sql "INSERT INTO `login`(`Nachname`, `Vorname`, `Password`, `Username`, `EMail`, `Date`) VALUES ('$nachname','$vorname', '$passwort', '$username', '$email', now())";
                  if (!
            mysqli_query($con$sql)){
                     die(
            'Error: ' mysqli_error($con));
                  }  
                   
            $num mysqli_affected_rows($con);
                  if (
            $num>0)
                  {
                     echo 
            "<p><font color='#00aa00'>";
                     echo 
            "Ein Datensatz hinzugekommen";
                     echo 
            "</font></p>";
                  }
                  else
                  {
                     echo 
            "<p><font color='#ff0000'>";
                     echo 
            "Es ist ein Fehler aufgetreten, ";
                     echo 
            "es ist kein Datensatz hinzugekommen";
                     echo 
            "</font></p>";
                  }
                   
            mysqli_close($con);
               }
            ?>
            </head>
            <body>
            <p>Sie können einen Benutzer eingeben!<br>
            Nach der Eingabe ist das Formular abzusenden:</p>
            <form action = "eingabe_benutzer.php" method = "post">
               <p><input name="vorname"> Vorname</p>
               <p><input name="nachname"> Nachname</p>
               <p><input name="username"> Benutzername</p>
               <p><input name="passwort"> Passwort</p>
               <p><input name="email"> E-Mail-Adresse</p>
               <p><input type="hidden" name="datum" value="<?php echo date("Y-m-d H:i:s"?>"></p>
               <p><input type="submit" name="gesendet">
               <input type="reset"></p>
            </form>
            </body></html>
            Zuletzt geändert von romae; 27.04.2020, 10:14.

            Kommentar


            • #7
              Ich sehe hier überhaupt kein Debugging. Wird da nur im Blindflug herumprobiert?

              Mach paar var_dump() Ausgaben der Variableninhalte und Funktionsrückgabewerte.

              Kommentar


              • #8
                Danke für den Tipp!

                Bei Eingabe von
                Code:
                var_dump($dt); echo "<br>";
                in den Bereichen von
                Code:
                echo '<script>alert("Falsche Benutzer Daten")</script>';
                erscheint folgende Meldung:
                array(2) { ["id"]=> string(2) "50" ["password"]=> string(60) "$2y$10$AGPUL.uOaJ6W83XF4zwUa.h5IsTMO.U6W665Uqia/gGUoJ3YyiTcO" }

                Im Bereich des Codes
                Code:
                $_SESSION["login_user"] = $dt["id"];
                header("location:mainpage.php");
                erscheint nach Eingabe von
                Code:
                var_dump($dt); echo "<br>";
                keine Ausgabe, da das Programm trotz korrekter Passwordeingabe nicht hinkommt.

                Kommentar


                • #9
                  Und was steht in $password?

                  Kommentar


                  • #10
                    In $Password steht:
                    string(3) "123"

                    Kommentar


                    • #11
                      Tja, da passen Passwort und Hash nicht zusammen:

                      PHP-Code:
                      var_dump(
                          
                      password_verify(
                              
                      '123',
                              
                      '$2y$10$AGPUL.uOaJ6W83XF4zwUa.h5IsTMO.U6W665Uqia/gGUoJ3YyiTcO'
                          
                      )
                      );
                      // bool(false) 
                      Was mir auffällt, beim Speichern des Passwort-Hash in der Datenbank beachtest du den Kontextwechsel nach SQL nicht. Werte, die in SQL eingefügt werden, müssen mit mysqli_real_escape_string() behandelt werden.

                      Kommentar


                      • #12
                        mysqli_real_escape_string() habe ich im Code der Datei "eingabe_benutzer.php" drinnen.

                        Code:
                              // Verbindungsüberprüfung
                              if (mysqli_connect_errno()) {
                                 echo "Verbingungsaufbau zu MySQL klappt nicht!: " . mysqli_connect_error();
                              }
                               $vorname = mysqli_real_escape_string($con, $_POST['vorname']);
                              $nachname = mysqli_real_escape_string($con, $_POST['nachname']);
                              $passwort = mysqli_real_escape_string($con, $_POST['passwort']);
                              $username = mysqli_real_escape_string($con, $_POST['username']);
                              $email = mysqli_real_escape_string($con, $_POST['email']);
                              $datum = mysqli_real_escape_string($con, $_POST['datum']);
                               //Die Passwortverschlüsselung geschieht hier!
                              $pw = 'passwort';
                              $passwort = password_hash($pw, PASSWORD_DEFAULT);
                               $sql = "INSERT INTO `login`(`Nachname`, `Vorname`, `Password`, `Username`, `EMail`, `Date`) VALUES ('$nachname','$vorname', '$passwort', '$username', '$email', now())";
                              if (!mysqli_query($con, $sql)){
                                 die('Error: ' . mysqli_error($con));

                        Kommentar


                        • #13
                          Nein, du fügst den mit password_hash() generierten Wert direkt im SQL-Code ein. Dafür wendest du vorher unnötig mysqli_real_escape_string() an $_POST['passwort'] an, wo es überhaupt nichts bringt, im Gegenteil sogar Werte kaputt machen kann.

                          Dein Sprachenmischmasch macht mich übrigens einen Hauch unruhig. Einmal passwort, einmal passwort. Kann man nicht mal bei einer Sprache bleiben? Warum dieser Mischmasch? Damit die Fehlerwahrscheinlichkeit steigt?
                          Zuletzt geändert von h3ll; 27.04.2020, 23:04.

                          Kommentar


                          • #14
                            Danke!

                            Nun klappt die Login-Abfrage und ich komme ins Programm rein. Super!

                            PHP-Code:
                            <!DOCTYPE html><html><head><meta charset="utf-8">
                            <?php
                               
                            if (isset($_POST["gesendet"]))
                               {
                                  
                            $con mysqli_connect("localhost""root""""users");
                                   
                            // Verbindungsüberprüfung
                                  
                            if (mysqli_connect_errno()) {
                                     echo 
                            "Verbingungsaufbau zu MySQL klappt nicht!: " mysqli_connect_error();
                                  }
                                   
                            $vorname $_POST["vorname"];
                                  
                            $nachname $_POST["nachname"];
                                  
                            $passwort $_POST["passwort"];
                                  
                            $username $_POST["username"];
                                  
                            $email $_POST["email"];
                                  
                            $datum $_POST["datum"];
                                   
                            //Die Passwortverschlüsselung geschieht hier!
                                  
                            $pw $passwort;
                                  
                            $passwort password_hash($pwPASSWORD_DEFAULT);
                                   
                            $sql "INSERT INTO `login`(`Nachname`, `Vorname`, `Password`, `Username`, `EMail`, `Date`) VALUES ('$nachname','$vorname', '$passwort', '$username', '$email', now())";
                                  if (!
                            mysqli_query($con$sql)){
                                     die(
                            'Error: ' mysqli_error($con));
                                  }  
                                   
                            $num mysqli_affected_rows($con);
                                  if (
                            $num>0)
                                  {
                                     echo 
                            "<p><font color='#00aa00'>";
                                     echo 
                            "Ein Datensatz hinzugekommen";
                                     echo 
                            "</font></p>";
                                  }
                                  else
                                  {
                                     echo 
                            "<p><font color='#ff0000'>";
                                     echo 
                            "Es ist ein Fehler aufgetreten, ";
                                     echo 
                            "es ist kein Datensatz hinzugekommen";
                                     echo 
                            "</font></p>";
                                  }
                                   
                            mysqli_close($con);
                               }
                            ?>
                            </head>
                            <body>
                            <p>Sie können einen Benutzer eingeben!<br>
                            Nach der Eingabe ist das Formular abzusenden:</p>
                            <form action = "eingabe_benutzer.php" method = "post">
                               <p><input name="vorname"> Vorname</p>
                               <p><input name="nachname"> Nachname</p>
                               <p><input name="username"> Benutzername</p>
                               <p><input name="passwort"> Passwort</p>
                               <p><input name="email"> E-Mail-Adresse</p>
                               <p><input type="hidden" name="datum" value="<?php echo date("Y-m-d H:i:s"?>"></p>
                               <p><input type="submit" name="gesendet">
                               <input type="reset"></p>
                            </form>
                            </body></html>

                            Kommentar

                            Lädt...
                            X