Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Sichere Benutzerauthentifizierung

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Sichere Benutzerauthentifizierung

    Hallo, ich möchte eine sichere Benutzerauthentifizierung programmieren, habe aber noch relativ wenig PHP-Kenntnisse.
    Folgenden Code verwende ich um einen Benutzer in die Datenbank einzufügen. Bitte sagt mir, wie ich den Code noch sicherer machen kann.

    PHP-Code:
    <?php

    include_once $_SERVER['DOCUMENT_ROOT'] . 'access.php';

    $mysql mysqli_connect($db_host$db_user$db_pwd$db_name);

    if (
    mysqli_connect_errno()) {
     echo 
    "<p>Fehler: Verbindung zur Datenbank nicht möglich. Versuchen Sie es zu einem späteren Zeitpunkt nochmal.</p>";
     exit();
    }

    $user filter_input(INPUT_POST'user'FILTER_SANITIZE_STRING);
    $password filter_input(INPUT_POST'password'FILTER_SANITIZE_STRING);

    if (!
    get_magic_quotes_gpc()) {
    $user addslashes($user);
    $password addslashes($password);
    }

    if (!
    user || !$password) {
    echo 
    "<p>Bitte füllen Sie alle Felder aus.</p>";
    exit();
    }

    $options = [
        
    'cost' => 11,
        
    'salt' => mcrypt_create_iv(22MCRYPT_DEV_URANDOM),
    ];

    $password password_hash($passwordPASSWORD_BCRYPT$options);

    $query "INSERT into users values ('" $user "', '" $password "', '" NULL "', '" NULL "')";

    $result mysqli_query($mysql$query);

    if (
    $result) {
     echo 
    "Der Benutzer wurde erfolgreich hinzugef&uuml;gt.";
    }

    else {
     echo 
    "<p>Ein Fehler ist aufgetreten.</p>";
    }

    mysqli_close($mysql);

    ?>
    Nun möchte ich mit password_verify() das Passwort beim Login überprüfen.
    Ich weis aber leider nicht wie ich den Hash aus der Datenbank in eine Variable speichern kann um ihn mit dem eingegebenen PW vergleichen zu können.

  • #2
    - Vergiss das add/strip slashes Zeug hier. Deaktiviere magic quotes fix per Server-Einstellung Hoster oder php.ini, und nutze prepared Statements für das Login zum DB Auslesen, dann passt das.

    Sonst noch:

    - Konsequent auf UTF-8 setzen und solche verstümmelungen bleiben lassen "hinzugef&uuml;gt"

    - Und dann noch: - http://www.ermshaus.org/2012/09/php-...emals-ohne-dir

    LG

    Kommentar


    • #3
      Danke für die Hilfe, aber wie genau vergleiche ich jetzt beim Login Benutzername und Passwort mit password_verify().
      Ich weis leider noch nicht wie man das Passwort aus der DB in eine Variable speichert.

      Kommentar


      • #4
        was machste denn für options?
        - biste dir sicher das ein salt mit mcrypt_create_iv generiert, das tut was du willst?
        - wieso setzte denn den cost auf 11

        Kommentar


        • #5
          Zitat von ShadowSniper Beitrag anzeigen
          Ich weis leider noch nicht wie man das Passwort aus der DB in eine Variable speichert.
          Gibts im Web einige Beispiele, zB hier weiter unten: http://php.net/manual/de/mysqli.prepare.php

          Und dann vergleichst du mit password_verify() die Eingabe mit dem Hash laut DB.

          Kommentar


          • #6
            @moma:
            Ich hatte zuvor einen sha1-Hash verwendet. Dann habe ich herausgefunden,
            das dieser nicht sicher sein soll. Also habe ich ich im INet nach Alternativen
            geschaut und bin dann auf mcrypt_create_iv() gekommen und denke das
            dass auf jeden Fall sicherer ist, da ein salted password verwendet wird.
            Ich weis aber nicht, ob die Optionen so sinnvoll sind.
            Deswegen habe ich auch diesen Thread erstellt, weil ich unbedingt eine hohe Sicherheit für mein Login-System benötige.
            Vielleicht könnt ihr mir bessere Optionen sagen oder einen anderen Hash zeigen.


            @hausl:
            Danke für den Link!

            Kommentar


            • #7
              da ein salted password verwendet wird
              Das macht password_hash() auch, jedes man wird ein neuer /anderer Hash berechnet weil immer ein andere salt verwendet wird.

              PHP-Code:

              $pass 
              "geheim";

              for (
              $i 1$i <= 10$i++) {
                
              $hashed password_hash($passPASSWORD_DEFAULT);
                
              var_dump($hashed);
                
              var_dumppassword_verify($pass$hashed) );
              }

              /*
                string(60) "$2y$10$hM8KUnXW4n3pOoY6Ft1WC.mI2c5ALzHf.yxB8ENFXFgc.Pqw.ZT9u"
                bool(true)
                string(60) "$2y$10$l5jaZ0Mai6asiTmL9tHmbu9fYl8hKBCV4hzj7Ybf2byRjTREqY9Ve"
                bool(true)
                string(60) "$2y$10$k/cu1n16eIGXDyM0IALA8eUKjaYfitqBFq6dkOxUWZzhDG3yzskOm"
                bool(true)
                string(60) "$2y$10$2f0Kg8FhXjmnBZ/M1rQEb.QY7MUndHOWaFEAro4MXjTL7vZ977VKu"
                bool(true)
                string(60) "$2y$10$WGCtnf2v8NbH69nOrS5NDufTlyvmViJkMgy4pEeQx/2ts1FcHJ6RO"
                bool(true)
                string(60) "$2y$10$JiLGF2rV8FGca.IWbyYRMuvFsrflrelE.nLAcy6WVPCNZy2P5Lbme"  
                bool(true)
                string(60) "$2y$10$TBD5R3h/Rso.PpaMbCRZm.gcyP92XqN3RwhkZywqEfF07L92saDZW"
                bool(true)
                string(60) "$2y$10$dOANNqcj4H2vcxXqMqOXPu8fF7f5HOP/kJ/l7U4bq9EUGsMiGQyp6"
                bool(true)
                string(60) "$2y$10$5QQZfN9sLfZq0OhJctrnSOV5QgvfFIQ9rB.xOtnOlcspNIpgZz1.y"
                bool(true)
                string(60) "$2y$10$7vy9sTdkkxa6Yg1gTXn.sekimQczSY.gFxNTWalrpsVqwLsgH/p4O"
                bool(true)
              */ 

              Kommentar


              • #8
                Habe jetzt versucht mit prepared Statements zu arbeiten.
                Es kommt aber folgende Fehlermeldung:

                Fatal error: Call to a member function bindParam() on a non-object in #####/add_user.php on line 36

                PHP-Code:
                $options = [
                    
                'cost' => 11,
                    
                'salt' => mcrypt_create_iv(22MCRYPT_DEV_URANDOM),
                ];

                $password password_hash($passwordPASSWORD_BCRYPT$options);

                $stmt $mysql->prepare("INSERT INTO users (user, password, email, ip) VALUES
                        (:user, :password, :email, :ip)"
                );

                $stmt->bindParam(':user'$user);
                $stmt->bindParam(':password'$password);
                $stmt->bindParam(':email'NULL);
                $stmt->bindParam(':ip'NULL);

                $stmt->execute(); 

                Kommentar


                • #9
                  $stmt ist nicht das für was du es hältst, lass dir mal die Fehler ausgeben.
                  http://php.net/manual/de/pdo.error-handling.php

                  Du hast schon eine korrekte PDO-Instanz oben wo erstellt?
                  LG

                  Kommentar


                  • #10
                    Jetzt wird komischerweise nur noch dieser Fehler ausgegeben:
                    Mit PDO::ERRMODE_WARNING habe ich versucht mehr herauszufinden.

                    Parse error: syntax error, unexpected '$stmt' (T_VARIABLE) in #####/php/add_user.php on line 41

                    Dies ist mein ganzer Quellcode:

                    PHP-Code:
                    <?php

                    header
                    ('Content-Type: text/html; charset=utf-8');

                    include_once 
                    __DIR__ '/includes/access/access.php';

                    // Mit Datenbank verbinden
                    $mysql mysqli_connect($db_host$db_user$db_pwd$db_name);

                    if (
                    mysqli_connect_errno()) {
                     echo 
                    "<p>Fehler: Verbindung zur Datenbank nicht möglich. Versuchen Sie es zu einem späteren Zeitpunkt nochmal.</p>";
                     exit();
                    }

                    $user filter_input(INPUT_POST'user'FILTER_SANITIZE_STRING);
                    $password filter_input(INPUT_POST'password'FILTER_SANITIZE_STRING);

                    if (!
                    user || !$password) {
                    echo 
                    "<p>Bitte füllen Sie alle Felder aus.</p>";
                    exit();
                    }

                    $options = [
                        
                    'cost' => 11,
                        
                    'salt' => mcrypt_create_iv(22MCRYPT_DEV_URANDOM),
                    ];

                    $password password_hash($passwordPASSWORD_BCRYPT$options);

                    $stmt $mysql->prepare("INSERT INTO users (user, password, email, ip) VALUES
                            (:user, :password, :email, :ip)"
                    );

                    $stmt->bindParam(':user'$user);
                    $stmt->bindParam(':password'$password);
                    $stmt->bindParam(':email'NULL);
                    $stmt->bindParam(':ip'NULL);

                    PDO::ERRMODE_WARNING

                    $stmt
                    ->execute();

                    echo 
                    "Der Benutzer wurde erfolgreich hinzugefügt.";

                    mysqli_close($mysql);

                    ?>

                    Kommentar


                    • #11
                      Du mischt mysqli und PDO das geht nicht. Entweder oder... Und mysqli kennt nur ? in prep. Statements. Das mit den : kennt nur PDO.

                      Und das so "PDO::ERRMODE_WARNING " ist sowieso ein Syntaxfehler, egal wie.

                      Kommentar


                      • #12
                        Kannst du mir sagen wie ich es richtig mache mit mysqli?
                        Meine Kenntnisse sind dafür noch nicht gut genug.

                        Kommentar


                        • #13
                          Doku lesen!

                          http://de2.php.net/manual/de/book.mysqli.php

                          Kommentar

                          Lädt...
                          X