Ankündigung

Einklappen
Keine Ankündigung bisher.

Login-Skript: Login oft erst beim 2. Mal erfolgreich

Einklappen

Neue Werbung 2019

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

  • Login-Skript: Login oft erst beim 2. Mal erfolgreich

    Hallo,

    ich habe bei meinem Login-Skript das Problem, dass ich manchmal (aber nicht immer) zwei mal auf den Submit-Button klicken muss, damit die Weiterleitung zum Backend funktioniert. D.h. manchmal wird das Formular beim ersten Absenden einfach neu aufgerufen und ich muss es nochmal abschicken, erst dann klappt es. Komischerweise nicht immer, aber ich habe noch nicht herausgefunden wann das so ist.. Ich vermute mal dass das mit der Session zu tun hat?

    Hier der Code:

    PHP-Code:
    <?php
    session_start
    ();

    // Wurde das Skript schon installiert?
    if(!file_exists("config/dbconfig.php")) {
        
    header("location: install.php");
    }

    // Falls eingeloggt, Weiterleitung zum Backend
    if(isset($_SESSION['login'])) {
        
    header("location: backend/index.php?menu=dashboard");
    }

    $error 0;

    include(
    "config/config.php");
    include(
    $path."inc/dbconnect.php");

    // Formular abgeschickt 
    if(isset($_POST["submit"])) {
        
    $login_name $_POST["login_name"];    
        
    $login_pw hash('sha256'$_POST["login_pw"]);
        
        
    // Admin und Passwort vergleichen
        
    $queryStr "SELECT * FROM " $dbpraefix "users WHERE username = '$login_name' LIMIT 1";
        
    $query $con -> query($queryStr);
        
    $row $query -> fetch_assoc();
        
        
    // Zugangsdaten korrekt
        
    if($login_pw == $row["password"]) {
            
    $_SESSION['login'] = 1;
            
    $_SESSION['userid'] = $row["id"];
            
    $_SESSION['admin'] = $row["admin"];
            
    $_SESSION['username'] = $login_name;
            
            
    header("location: backend/index.php?menu=dashboard");
        } 
        
    // Zugangsdaten falsch
        
    else {
            
    $error 1;
        }
    }
    ?>
    <!DOCTYPE html>
    <html lang="de">
    <head>

        <!-- Begin Head -->
        <?php include("inc/html/meta.php"); ?>
        <!-- End Head -->
        
    </head>
    <body>

    <div id="form-wrapper"<?php if($error==1) { echo ' class="error"'; } ?>>
        <h1><i class="fa fa-user"></i> Login</h1>
        <?php 
            
    if($error===1) {
        
    ?>
            <div class="alert-wrapper">
                <div class="alert alert-danger">
                    <p>Der Benutzername oder das Passwort ist falsch. Bitte versuchen Sie es erneut.</p>
                </div>
            </div>
        <?php
            
    }        
        
    ?>
        <form action="index.php" method="post" role="form">
            <div class="form-group">
                <input type="text" class="form-control" name="login_name" id="login_name" value="Benutzername" onfocus="focus_field_name(this)" onblur="leave_field_name(this)">
            </div>
            <div class="form-group mandatory">
                <input type="password" class="form-control" name="login_pw" id="login_pw" value="Passwort" onfocus="focus_field_pass(this)" onblur="leave_field_pass(this)">
            </div>
            <button type="submit" class="btn btn-primary" name="submit">Anmelden</button>
        </form>
    </div>
               
    </body>
    </html>
    Ich hoffe ihr könnt mir helfen... Danke im Voraus!

    PS: In den include-Dateien sollte eigentlich nichts relevantes stehen.


  • #2
    Also ich kann mich da möglicherweise einloggen, ohne dass ich einen gültigen Benutzer, geschweige denn ein Passwort kenne.
    Schlag mal den Begriff "sql injection" nach
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      Danke für die Antwort.

      Du meinst wahrscheinlich, dass ich die beiden übergebenen Werte Name und Passwort escape, richtig? Also mysql_real_escape_string bzw. die MySQLi-Variante davon...

      Hast du trotzdem eine Lösung für mein eigentliches Problem?

      Kommentar


      • #4
        Nach einem header-redirect solltest du das aktuelle Script beenden, um nachfolgenden Code nicht auszuführen...
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Danke...

          Leider ändert sich durch "exit;" hinter dem Redirect nichts an meinem eigentlichen Problem...

          eine Frage hätte ich noch:
          Ist mein Code so gegen SQL-Injections geschützt?

          PHP-Code:
          $login_name mysqli_real_escape_string($con$_POST["login_name"]);    
              
          $login_pw mysqli_real_escape_string($conhash('sha256'$_POST["login_pw"])); 
          Und muss man IMMER, wenn man einen Query durchführt, so escapen?

          Kommentar


          • #6
            Zitat von dazzle89 Beitrag anzeigen
            Ist mein Code so gegen SQL-Injections geschützt?
            ...
            Und muss man IMMER, wenn man einen Query durchführt, so escapen?
            http://php-de.github.io/jumpto/sql-injection/

            Wenn du verstehst worum es eigentlich geht, kannst du dir die Frage selbst beantworten und hast sogar noch etwas gelernt dabei.

            PHP-Code:
            include("config/config.php");
            include(
            $path."inc/dbconnect.php"); 
            Includes niemals ohne _DIR_

            PHP-Code:
            $queryStr "SELECT * FROM 
            http://php-de.github.io/jumpto/code-smells/#select-

            Und zu deinem Problem: Debugge. Lass dir mal alles relevante zum Login / Session etc.. ausgeben und schau was passiert beim Aufruf.. irgendwo wird da dann bestimmt was hochkommen was dir dann hilft dein Problem einzugrenzen.

            http://php-de.github.io/jumpto/leitfaden/

            LG
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Ok danke!

              Ich werd mir das mal anschauen.

              Kommentar


              • #8
                Sorry für den Doppelpost...

                aber ich komme leider nicht weiter.

                Ich habe versucht so gut wie möglich zu debuggen und dabei rausgefunden, dass die POST-Variablen erst beim 2. Ausfüllen übergeben werden. Das heißt, wen ich das Formular zum ersten Mal ausfülle und sich die Seite daraufhin selbst neu aufruft, ist das POST-Array komplett leer. Das erklärt auch, warum der Login nicht funktioniert, denn die Abfrage if(isset($_POST["submit"])) ist erst beim 2. Mal true.

                Allerdings habe ich keinen Plan, warum das so ist. Vielleicht habt ihr noch Ideen?

                Vielen Dank

                Kommentar


                • #9
                  An welcher Stelle hast du dir $_POST ausgeben lassen? Versuch mal ganz oben direkt nach session_...() mal ein var_dump($_POST) und kommentiere mal das ganze header Location Zeugs darunter aus und schau POST dann immer noch leer ist.

                  Ich denke du verwurstelst dich mit deinen header Location.

                  LG
                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Danke für die Antwort.

                    Also wenn ich mir das Array direkt am Anfang ausgeben lasse bzw. nach dem session_start, werden die Variablen tatsächlich übergeben...

                    Kommentar


                    • #11
                      Siehste Dann such mal weiter.. und prüfe deine ganzen Weiteleitungen genau. Ich vermute du leitst so um was du gar nicht willst, dann aber wieder zurück und dabei geht logischerweise POST verloren.
                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Eeeeeeeeeeendlich .... ich habe den Fehler gefunden

                        Es hatet scheinbar wirklich mit den Headers zu tun, denn auf der Folgeseite, also der Startseite des Backends, habe ich diesen Code

                        PHP-Code:
                        /**
                         * Automatisches Ausloggen bei Inaktivität
                         */
                        $queryStatusStr "SELECT * FROM " $dbpraefix "users WHERE lastAction <= DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND username = '$activeUser' LIMIT 1";
                        $queryStatus $con -> query($queryStatusStr);
                        $numStatus $queryStatus -> num_rows;
                        if(
                        $numStatus>0) {
                            
                        session_destroy();
                            
                        header("location: ../index.php");

                        Das erklärt auch, warum der Fehler bei mir gefühlt alle 10 Minuten aufgetreten ist. Ein < statt <= scheint das Problem zu lösen...

                        Danke!

                        Kommentar

                        Lädt...
                        X