Ankündigung

Einklappen
Keine Ankündigung bisher.

Login Script - Was läuft falsch?

Einklappen

Neue Werbung 2019

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

  • Login Script - Was läuft falsch?

    Hallo zusammen,

    ich versuche ein 'sicheres' Login Script auf meiner Seite zum implementieren, weiß aber nicht genau was hier schief läuft.

    Erstmal zum Script:

    Index.php

    PHP-Code:
    <?php
        
    // --- Includes ----
        
    include_once 'include/pslConfig.php';
        include_once(
    'include/class.login.php');

        
    // --- MySQL Connection aufbauen
        
    $mysqli = new mysqli(HOSTUSERPASSWORDDATABASE);

        
    // --- Secure Session starten
        
    sec_session_start();

        
    // --- Login Check
        
    if (login_check($mysqli) == true) {
            
    $logged 'in';
        } else {
            
    $logged 'out';
        }

    <
    form action="include/processLogin.php" id="" method="post" name="login_form">
                                                                    <
    div class="row">
                                                                        <
    div class="form-group">
                                                                            <
    div class="col-md-12">
                                                                                <
    label>E-mail Address</label>
                                                                                <
    input type="text" value="" name="email" class="form-control input-lg">
                                                                            </
    div>
                                                                        </
    div>
                                                                    </
    div>
                                                                    <
    div class="row">
                                                                        <
    div class="form-group">
                                                                            <
    div class="col-md-12">
                                                                                <
    class="pull-right" id="headerRecover" href="?page=lostPassword">(Lost Password?)</a>
                                                                                <
    label>Password</label>
                                                                                <
    input type="password" value="" name="password" class="form-control input-lg">
                                                                            </
    div>
                                                                        </
    div>
                                                                    </
    div>
                                                                    <
    div class="row">
                                                                        <
    div class="col-md-6">
                                                                            <
    span class="remember-box checkbox">
                                                                                <
    label for="rememberme">
                                                                                    <
    input type="checkbox" id="rememberme" name="rememberme">Remember Me
                                                                                
    </label>
                                                                            </
    span>
                                                                        </
    div>
                                                                        <
    div class="col-md-6">
                                                                            <
    input type="submit" value="Login" class="btn btn-primary pull-right push-bottom" data-loading-text="Loading..." onclick="formhash(this.form, this.form.password);"/>
                                                                        </
    div>
                                                                    </
    div>
                                                                </
    form>

    ?>

    processLogin.php


    PHP-Code:
    <?php  
        
    // --- Includes
        
    include_once 'pslConfig.php';
        include_once 
    'class.login.php';
        
        
    // --- MySQL Connection aufbauen
        
    $mysqli = new mysqli(HOSTUSERPASSWORDDATABASE);

        
    sec_session_start(); // Unsere selbstgemachte sichere Funktion um eine PHP-Sitzung zu starten.
      
        
    if (isset($_POST['email'], $_POST['p'])) {
            
    $email $_POST['email'];
            
    $password $_POST['p']; // Das gehashte Passwort.
         
            
    if (login($email$password$mysqli) == true) {
                
    // Login erfolgreich 
                
    header('Location: ../index.php?page=main');
                
    //echo htmlentities($_SESSION['username']);
            
    } else {
                
    // Login fehlgeschlagen 
                
    header('Location: ../index.php?page=main&error=1');
            }
        } else {
            
    // Die korrekten POST-Variablen wurden nicht zu dieser Seite geschickt. 
            
    echo 'Invalid Request';
        }
    ?>

    class.login.php


    PHP-Code:
    <?php

        
    function sec_session_start() {
            
    $session_name 'sec_session_id';   // vergib einen Sessionnamen
            
    $secure 'SECURE';
            
    // Damit wird verhindert, dass JavaScript auf die session id zugreifen kann.
            
    $httponly true;
            
    // Zwingt die Sessions nur Cookies zu benutzen.
            
    if (ini_set('session.use_only_cookies'1) === FALSE) {
                
    header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
                exit();
            }
            
    // Holt Cookie-Parameter.
            
    $cookieParams session_get_cookie_params();
            
    session_set_cookie_params($cookieParams["lifetime"],
                
    $cookieParams["path"], 
                
    $cookieParams["domain"], 
                
    $secure,
                
    $httponly);
            
    // Setzt den Session-Name zu oben angegebenem.
            
    session_name($session_name);
            
    session_start();            // Startet die PHP-Sitzung 
            
    session_regenerate_id();    // Erneuert die Session, löscht die alte. 
        
    }

        function 
    login($email$password$mysqli) {
            
    // Das Benutzen vorbereiteter Statements verhindert SQL-Injektion.
            
    if ($stmt $mysqli->prepare("SELECT MID, mUsername, mPassword, mSalt 
                FROM members
                WHERE mEmail = ?
                LIMIT 1"
    )) {
                
    $stmt->bind_param('s'$email);  // Bind "$email" to parameter.
                
    $stmt->execute();    // Führe die vorbereitete Anfrage aus.
                
    $stmt->store_result();
         
                
    // hole Variablen von result.
                
    $stmt->bind_result($user_id$username$db_password$salt);
                
    $stmt->fetch();
         
                
    // hash das Passwort mit dem eindeutigen salt.
                
    $password hash('sha512'$password $salt);
                if (
    $stmt->num_rows == 1) {
                    
    // Wenn es den Benutzer gibt, dann wird überprüft ob das Konto
                    // blockiert ist durch zu viele Login-Versuche 
         
                    
    if (checkbrute($user_id$mysqli) == true) {
                        
    // Konto ist blockiert 
                        // Schicke E-Mail an Benutzer, dass Konto blockiert ist
                        
    return false;
                    } else {
                        
    // Überprüfe, ob das Passwort in der Datenbank mit dem vom
                        // Benutzer angegebenen übereinstimmt.
                        
    if ($db_password == $password) {
                            
    // Passwort ist korrekt!
                            // Hole den user-agent string des Benutzers.
                            
    $user_browser $_SERVER['HTTP_USER_AGENT'];
                            
    // XSS-Schutz, denn eventuell wir der Wert gedruckt
                            
    $user_id preg_replace("/[^0-9]+/"""$user_id);
                            
    $_SESSION['user_id'] = $user_id;
                            
    // XSS-Schutz, denn eventuell wir der Wert gedruckt
                            
    $username preg_replace("/[^a-zA-Z0-9_\-]+/"
                                                                        
    ""
                                                                        
    $username);
                            
    $_SESSION['username'] = $username;
                            
    $_SESSION['login_string'] = hash('sha512'
                                      
    $password $user_browser);
                            
    // Login erfolgreich.
                            
    return true;
                        } else {
                            
    // Passwort ist nicht korrekt
                            // Der Versuch wird in der Datenbank gespeichert
                            
    $now time();
                            
    $mysqli->query("INSERT INTO login_attempts(lamid, laTime)
                                            VALUES ('
    $user_id', '$now')");
                            return 
    false;
                        }
                    }
                } else {
                    
    //Es gibt keinen Benutzer.
                    
    return false;
                }
            }
        }
    Wenn ich die Weiterleitung in 'processLogin.php' rausnehme und mir den Session Usernamen anzeige, wird dieser angezeigt.
    Wenn ich dies auf der index.php versuche, gibt es die Variable '$_SESSION['username']' gar nicht?!

    Wo ist hier der Denkfehler?

    Danke im Voraus.

  • #2
    index.php und processLogin.php(wird in index.php includet) haben

    je 2 mal

    include_once 'include/pslConfig.php';
    include_once('include/class.login.php');

    sec_session_start(); auch

    sorry schlecht überflogen

    Kommentar


    • #3
      Zitat von sync2014 Beitrag anzeigen
      index.php und processLogin.php(wird in index.php includet) haben

      je 2 mal

      include_once 'include/pslConfig.php';
      include_once('include/class.login.php');

      sec_session_start(); auch

      sorry schlecht überflogen
      processLogin.php wird nicht includet, sondern aufgerufen und liegt in einem anderen Verzeichnis wie die index.php. Daher werden bei beiden die Login-Klasse, sowie die DB Einstellungen includet.
      Das gleiche gilt für den Session Aufbau

      Kommentar


      • #4
        Ja sorry. Auf den 2ten blick dann auch gesehen

        Zitat von sync2014 Beitrag anzeigen
        sorry schlecht überflogen

        Kommentar


        • #5
          Eventuell wird deine Session wird im Pfad "domainname"/include erzeugt.
          Im übergeordneten Verzeichnis wo dein index.php liegt ist deine erzeugte Session nicht mehr gültig.

          Oder hast du das bereits berücksichtigt?

          Kommentar


          • #6
            Zitat von M0op Beitrag anzeigen
            Eventuell wird deine Session wird im Pfad "domainname"/include erzeugt.
            Im übergeordneten Verzeichnis wo dein index.php liegt ist deine erzeugte Session nicht mehr gültig.

            Oder hast du das bereits berücksichtigt?
            CookieParams (abgerufen von processLogin.php): array(5) { ["lifetime"]=> int(0) ["path"]=> string(1) "/" ["domain"]=> string(0) "" ["secure"]=> bool(true) ["httponly"]=> bool(true) }

            Des Weiteren habe ich schonmal versucht alles in der index.php einzubinden und den Zwischenschritt über die processLogin.php wegzulassen.
            Auch hier werden die Session Variablen anscheinend Überschrieben?

            Kommentar


            • #7
              Damn... Sorry all, my fault.

              Variable '$secure' had to be set to 'false' cause in my developement area, https is not used -_-"


              // Edith: Keine Ahnung warum ich eben auf Englisch geantwortet habe

              Kommentar

              Lädt...
              X