sichere Benutzerauthentifizierung?

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

  • sichere Benutzerauthentifizierung?

    Hallo zusammen,

    ich bin neu hier und habe noch recht wenig PHP-Kentnisse.
    Ich versuche zur Zeit eine sichere(!) Benutzerauthentifizierung zu implementieren.
    Momentan bin ich noch beim Script, um einen neuen User in die Datenbank einzutragen. Dabei gehe ich folgendermaßen vor:

    - DB-Access über Include einbinden
    - DB-Verbindung aufbauen
    - Benutzereingaben mit FILTER_SANITIZE_STRING filtern
    - Passwort mit password_hash() und mcrypt_create_iv() verschlüsseln
    - DB-Eintrag mit prepared statements durchführen
    - DB-Verbindung schließen

    Beim ausführen erhalte ich folgende Fehlermeldung:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':user, assword, :email, :ip)' at line 2

    Könnt ihr mir sagen wo der Fehler liegt? Außerdem würde gerne wissen wie ich das Passwort noch besser verschlüsseln kann und das Script im Allgemeinen sicherer machen kann.

    Hier ist mein kompletter Quellcode:

    PHP-Code:
    <?php
    header
    ('Content-Type: text/html; charset=utf-8');
    include_once 
    __DIR__ '/includes/access/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);
    $email NULL;
    $ip NULL;

    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 (user, password, email, ip) VALUES
            (:user, :password, :email, :ip)"
    ;

    if (
    $stmt mysqli_prepare ($mysql$query)) {
        
    mysqli_stmt_bind_Param($stmt':user'$user);
        
    mysqli_stmt_bind_Param($stmt':password'$password);
        
    mysqli_stmt_bind_Param($stmt':email'$email);
        
    mysqli_stmt_bind_Param($stmt':ip'$ip);
        
        
    mysqli_stmt_execute($stmt);

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

    else {
        echo 
    $mysql -> error;
    }

    mysqli_close($mysql);
    ?>

  • #2
    Wie kommst du auf die Idee, dass man bei mysqli_prepare() :user, assword, usw. als Platzhalter verwenden kann?

    Kommentar


    • #3
      Von dieser Seite: PHP: Prepared Statements und Stored Procedures - Manual
      Aber anscheinend habe ich da was falsch verstanden!

      Kommentar


      • #4
        Zitat von ShadowSniper Beitrag anzeigen
        Von dieser Seite: PHP: Prepared Statements und Stored Procedures - Manual
        Aber anscheinend habe ich da was falsch verstanden!
        Das ist die Doku zu PDO und nicht zu mysqli. Wobei ich dir empfehlen würde gleich auf PDO umzusteigen.

        Kommentar


        • #5
          Wie müsste das denn aussehen mit PDO??
          Habe ich schon probiert, hat aber auch nicht so funktioniert wie ich das wollte.

          Kommentar


          • #6
            Zitat von ShadowSniper Beitrag anzeigen
            Wie müsste das denn aussehen mit PDO??
            So wie es in der Doku zu PDO steht

            Kommentar


            • #7
              pro und contra

              PDO oder mysqli ???
              fotos :

              http://www.flickr.com/photos/rassloff/collections/

              Kommentar


              • #8
                Ich möchte das ganze jetzt mit PDO machen.
                Mein Problem ist das ich nicht richtig weis wie man damit die DB-Verbindung herstellt.
                Ich habe danach gesucht und den Code jetzt so geändert:

                PHP-Code:
                <?php
                header
                ('Content-Type: text/html; charset=utf-8');
                include_once 
                __DIR__ '/includes/access/access.php';

                $user filter_input(INPUT_POST'user'FILTER_SANITIZE_STRING);
                $password filter_input(INPUT_POST'password'FILTER_SANITIZE_STRING);
                $email NULL;
                $ip NULL;

                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);

                try {
                    
                $dbh = new PDO('mysql:host=$db_host;dbname=$db_name'$db_user$db_pwd);

                    
                $query "INSERT INTO users (user, password, email, ip) VALUES
                            (:user, :password, :email, :ip)"
                ;

                    
                $stmt $dbh->prepare($query);

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

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

                catch (
                PDOException $e) {
                   print 
                "Error!: " $e->getMessage() . "<br/>";
                   die();
                }
                ?>
                Diese Fehlermeldungen werden mir angezeigt:

                Warning: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known in ###/php/add_user.php on line 32
                Error!: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

                Also muss irgendwas mit bindParam() nicht stimmen oder?

                Kommentar


                • #9
                  Ich habe nun noch eine Server-Variable eingefügt und danach kommt nur noch diese Fehlermeldung:

                  Error!: SQLSTATE[HY000] [2002] Connection refused

                  Kommentar


                  • #10
                    Ich habe erneut den Code verändert. Jetzt funktioniert das registrieren,
                    aber die Anmeldung leider noch nicht. Kann mir Jemand sagen was an der Abfrage mit password_verify() in login.php falsch ist?

                    register.php
                    PHP-Code:
                    <?php 
                        
                    require_once __DIR__ '/common.php';

                        
                    $username filter_input(INPUT_POST'username'FILTER_SANITIZE_STRING);
                        
                    $userPassword filter_input(INPUT_POST'password'FILTER_SANITIZE_STRING); 
                         
                        if(!empty(
                    $_POST)) 
                        { 
                            if(empty(
                    $_POST['username'])) 
                            { 
                                die(
                    "Please enter a username."); 
                            } 
                             
                            if(empty(
                    $_POST['password'])) 
                            { 
                                die(
                    "Please enter a password."); 
                            } 

                            if(!
                    filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
                            { 
                                die(
                    "Invalid E-Mail Address"); 
                            } 
                             
                            
                    $query 
                                SELECT 
                                    1 
                                FROM users 
                                WHERE 
                                    user = :username 
                            "

                             
                            
                    $query_params = array( 
                                
                    ':username' => $username
                            
                    ); 
                             
                            try 
                            { 
                                
                    $stmt $db->prepare($query); 
                                
                    $result $stmt->execute($query_params); 
                            } 
                            catch(
                    PDOException $ex
                            { 
                                die(
                    "Failed to run query: " $ex->getMessage()); 
                            } 

                            
                    $row $stmt->fetch(); 
                             
                            if(
                    $row
                            { 
                                die(
                    "This username is already in use"); 
                            } 

                            
                    $query 
                                SELECT 
                                    1 
                                FROM users 
                                WHERE 
                                    email = :email 
                            "

                             
                            
                    $query_params = array( 
                                
                    ':email' => $_POST['email'
                            ); 
                             
                            try 
                            { 
                                
                    $stmt $db->prepare($query); 
                                
                    $result $stmt->execute($query_params); 
                            } 
                            catch(
                    PDOException $ex
                            { 
                                die(
                    "Failed to run query: " $ex->getMessage()); 
                            } 
                             
                            
                    $row $stmt->fetch(); 
                             
                            if(
                    $row
                            { 
                                die(
                    "This email address is already registered"); 
                            } 
                     
                            
                    $query 
                                INSERT INTO users ( 
                                    user, 
                                    password, 
                                    email 
                                ) VALUES ( 
                                    :username, 
                                    :password, 
                                    :email 
                                ) 
                            "

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

                            
                    $password password_hash($passwordPASSWORD_BCRYPT$options);
                             
                            
                    $query_params = array( 
                                
                    ':username' => $username
                                
                    ':password' => $password
                                
                    ':email' => $_POST['email'
                            ); 
                             
                            try 
                            { 
                                
                    $stmt $db->prepare($query); 
                                
                    $result $stmt->execute($query_params); 
                            } 
                            catch(
                    PDOException $ex
                            { 
                                die(
                    "Failed to run query: " $ex->getMessage()); 
                            } 

                            
                    header("Location: login.php"); 
                             
                            die(
                    "Redirecting to login.php"); 
                        } 
                         
                    ?> 
                    <h1>Register</h1> 
                    <form action="register.php" method="post"> 
                        Username:<br /> 
                        <input type="text" name="username" value="" /> 
                        <br /><br /> 
                        E-Mail:<br /> 
                        <input type="text" name="email" value="" /> 
                        <br /><br /> 
                        Password:<br /> 
                        <input type="password" name="password" value="" /> 
                        <br /><br /> 
                        <input type="submit" value="Register" /> 
                    </form>
                    login.php
                    PHP-Code:
                    <?php 
                        
                    require_once __DIR__ '/common.php';

                        
                    $username filter_input(INPUT_POST'username'FILTER_SANITIZE_STRING);
                        
                    $userPassword filter_input(INPUT_POST'password'FILTER_SANITIZE_STRING); 
                         
                        
                    $submitted_username ''
                         
                        if(!empty(
                    $_POST)) 
                        { 
                            
                    $query 
                                SELECT 
                                    user, 
                                    password, 
                                    email 
                                FROM users 
                                WHERE 
                                    user = :username 
                            "

                             
                            
                    $query_params = array( 
                                
                    ':username' => $username 
                            
                    ); 
                             
                            try 
                            { 
                                
                    $stmt $db->prepare($query); 
                                
                    $result $stmt->execute($query_params); 
                            } 
                            catch(
                    PDOException $ex
                            { 
                                die(
                    "Failed to run query: " $ex->getMessage()); 
                            } 
                             
                            
                    $login_ok false
                             
                            
                    $row $stmt->fetch(); 
                            if(
                    $row
                            {                                  
                                if(
                    password_verify($userPassword$row['password'])) 
                                { 
                                    
                    $login_ok true
                                } 
                            } 
                             
                            if(
                    $login_ok
                            { 
                                unset(
                    $row['password']);
                                
                    $_SESSION['user'] = $row;  
                                 echo 
                    "Hier ist die geheime Seite!";
                            } 
                            else 
                            { 
                                print(
                    "Login Failed.");       
                                
                    $submitted_username htmlentities($usernameENT_QUOTES'UTF-8'); 
                            } 
                        }     
                    ?> 
                    <h1>Login</h1> 
                    <form action="login.php" method="post"> 
                        Username:<br /> 
                        <input type="text" name="username" value="<?php echo $submitted_username?>" /> 
                        <br /><br /> 
                        Password:<br /> 
                        <input type="password" name="password" value="" /> 
                        <br /><br /> 
                        <input type="submit" value="Login" /> 
                    </form>

                    Kommentar


                    • #11
                      So wie ich das verstanden habe nimmt password_verify() den Hash,
                      der von der DB kommt und überprüft ob er mit dem vom Benutzer eingegebenen Passwort übereinstimmt. Richtig?

                      Ich habe zur Überprüfung den Hash und das Passwort in Klartext übergeben, aber auch das hat leider nicht funktioniert.

                      Kommentar

                      Lädt...
                      X