Ankündigung

Einklappen
Keine Ankündigung bisher.

Loginscript funktioniert nicht

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

  • Loginscript funktioniert nicht

    Hallo PHP- und SQL-Profis,

    ich habe ein Loginscript getestet, dieses funktioniert allerdings nicht wie gewünscht.

    <?php
    session_start();
    $pdo = new PDO("mysql:host=localhost;dbname=php-einfach", "root", "");
    ?>
    <!DOCTYPE html>
    <html lang="de">
    <head>
    <title>Registrieren</title>
    <meta charset="utf-8">
    </head>
    <body>
    <h1>Registrieren</h1>

    <?php
    //Formular anzeigen
    $showFormular = true;

    //Wenn Formular abgeschickt ist
    if (isset($_GET["register"])){
    $error = false;
    $email = $_POST["email"];
    $vorname = $_POST["vorname"];
    $nachname = $_POST["nachname"];
    $passwort = $_POST["passwort"];
    $passwort_zwei = $_POST["passwort_zwei"];


    //Kontrolle, ob gültige E-Mail Adresse vorliegt
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo "Bitte eine gültige E-Mail Adresse angeben<br>";
    $error = true;
    }

    //Kontrolle, ob Passwort eingegeben wurde
    if (strlen($passwort) == 0){
    echo "Bitte Passwort eingeben.<br>";
    $error = true;
    }

    //Überprüfen, ob Passwörter übereinstimmen
    if ($passwort != $passwort_zwei){
    echo "Die Passwörter müssen übereinstimmen.<br>";
    $error = true;
    }
    if (!$error){
    $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
    $result = $statement->execute(array("email" => $email));
    $user = $statement->fetch();

    if ($user !== false) {
    echo "Diese E-Mail-Adresse ist bereits vergeben.<br>";
    $error = true;
    }
    }


    //Wenn keine Errors, Benutzer registrieren
    if (!$error){
    $password_hash = password_hash($passwort, PASSWORD_DEFAULT);

    $statement = $pdo->prepare("INSERT INTO users (vorname, nachname, email, Passwort) VALUES (:vorname, :nachname, :email, asswort");
    $result = $statement->execute(array("vorname" => $vorname, "nachname" => $nachname, "email" => $email, "passwort" => $password_hash));

    if ($result){
    echo 'Du wurdest erfolgreich eingeloggt.<br><a href="login.php">Login</a>';
    $showFormular = false;
    }
    else{
    echo "Bei dem Abspeichern ist leider ein Fehler unterlaufen.";
    }
    }
    }
    if ($showFormular){
    ?>
    <form action="?register=1" method="post">
    <label for="email">E-Mail Adresse</label><br>
    <input type="email" id="email" name="email" size="40" maxlength="250" required><br>
    <label for="vorname">Vorname</label><br>
    <input type="text" id="vorname" name="vorname" size="40" maxlength="250" required><br>
    <label for="nachname">Nachname</label><br>
    <input type="text" id="nachname" name="nachname" size="40" max="250"><br>
    <label for="passwort">Passwort</label><br>
    <input type="password" id="passwort" name="passwort" size="40" maxlength="250" required><br>
    <label for="passwort_zwei">Passwort wiederholen</label><br>
    <input type="password" id="passwort_zwei" name="passwort_zwei" size="40" maxlength="250" required><br>
    <input type="submit" id="submit" name="submit" value="Registrieren">
    </form>
    <?php
    }
    ?>

    Er gibt mir immer die Fehlermeldung "Bei dem Abspeichern ist leider ein Fehler unterlaufen" aus, alle vorherigen Kontrollprozeduren funktionieren ohne Fehlermeldung, also habe ich den Fehler ab "if (!$error)", leider kann ich den Fehlerteufel nicht finden.

    Ja, dass Passwort in dem INSERT INTO SQL-Query groß geschrieben ist, ist so richtig, bei der Anlage der Tabelle habe ich leider nicht darauf geachtet.

    Danke vorab für die Antworten.

  • #2
    Kannst du die Tabelle auch mal hier abbilden, rein stellen?
    https://arnego2.com <Webseiten, Umbau ab €80 und einiges mehr>

    VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €37

    Kommentar


    • #3
      Fällt dir was auf
      Code:
       if (isset($_GET["register"])){
      Code:
       <form action="?register=1" method="post">
      Mein (Basti1012) Forum und Chat

      Kommentar


      • #4
        Hi Hadrian9393,
        bevor ich dir Tipps gebe wie man eigene Fehler am besten in PHP validiert ein Paar Tipps für die Zukunft.

        Zu MySQL und die Einbindung von Datenbanken:
        PHP ermöglicht es unterschiedliche Datenbanksysteme einzubinden: MSSQL, Oracle, etc. Worauf ich raus will ist wie man was am besten einbindet.
        MySQL sollte man mit der PHP-Erweiterung Mysqli am besten betreiben, da es aus Performancegründen viel besser und schneller arbeitet als PDO. Dafür wurde das Modul extra ab PHP 7.0 verbessert.
        Ansonsten für alle anderen Datenbanksysteme ist PDO sehr gut geeignet, für MySQL ist aber Mysqli besser geeignet. siehe https://www.php.net/manual/de/intro.mysqli.php


        Zu GET und POST übertragen von Daten vom User:
        GET und POST ermöglichen unter anderem das Übertragen von Daten via Formular und anderen Techniken wie Ajax, etc. Was aber sehr, sehr wichtig ist, ist die Sicherheit. Du musst davon ausgehen, dass jeder User ein potenzieller Angreifer ist, der dir großen Schaden bringen kann. Um dies zu verhindern, gibt es die möglichkeit die Eingaben via POST und GET zu validieren.

        Wichtig ist, dass Sonderzeichen ge-escaped werden, sprich die Sonderzeichen werden entfernt oder maskiert. Funktionen wie htmlspeicalchars, mysqli_real_escape_string und strip_tags helfen dabei vor Angriffen zu schützen.

        Ein Beispiel:
        PHP-Code:
        function formvalid() {
           if(isset(
        $_POST['username'])) {
              
        $username htmlspecialchars($_POST['username'], ENT_QUOTES);
                 ...
           }


        Wenn du weitere Fragen zum Thema POST, GET, Allgemein über PHP und Sicherheit hast, einfach ins Forum schreiben.

        Gruss Localfu
        PS: Wenn euch mein Post gefallen hat, dann lasst mir ein "Daumen hoch" da!

        Kommentar


        • #5
          Oh, ich sehe meinen Fehler.
          vielen Dank für die nützlichen Tipps.
          Ich habe mir mit pdo eben gedacht, es wäre einfacher direkt ein System zu lernen, dass ich für alle Datenbanken benutzen kann.
          Das mit der Sicherheit ist so ein Ding. Das habe ich mich auch schon gefragt, warum hier in dem Beispiel kein Schutz vor Cross Site request forgery und Cross Site scripting hinterlegt wurde. Das habe ich den Ersteller auch schon gefragt, leider noch keine Antwort dazu enthalten. Ich habe auf meiner Website ein kontaktformular, dieses habe ich mit einer Funktion versehen, in der sämtliche Inputs durch htmlspecialchars, stripslashes und Trim laufen. Was passiert aber wenn ein Nutzer in seinem Passwort aus Sicherheitsgründen Sonderzeichen einbaut?

          Kommentar


          • #6
            Zitat von Hadrian9393 Beitrag anzeigen
            Was passiert aber wenn ein Nutzer in seinem Passwort aus Sicherheitsgründen Sonderzeichen einbaut?
            Passworte machen Sonderzeichen eher Sinn und sind unabhängig der Programmierung. bei Usernamen da muss darauf achten das da keine Sonderzeichen drin sind die in der Programmierung auch genutzt werden.
            https://arnego2.com <Webseiten, Umbau ab €80 und einiges mehr>

            VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €37

            Kommentar


            • #7
              Hallo,

              ich habe jetzt das Registrierungsformular und das Loginscript mit einem komplett neuen Ansatz, den ich sehr gut verständlich finde. Das Script funktioniert tatsächlich so auch bei mir in XAMPP.

              ]Jetzt wende ich mich den Sicherheitsaspekten zu, die
              Localfu angesprochen und beginne nun mit CSRF. Ich habe, wie Ihr unten sehen könnt, einen Token erstellt und in der Session gespeichert. Diesen gebe ich über ein Hidden-Feld in meinem Formular weiter und führe den Login nur nach einer erfolgreichen IF-Anweisung durch. Wird der richtige Token nicht übergeben, soll das Script über die Funktion die("Ungültiger Token") beendet werden...soweit die Theorie, das war auch mein Gedanke dahinter.
              In der Praxis bekomme ich leider nur den else Block mit "Ungültiger Token" angezeigt, jetzt habe ich mir verschiedene Tutorials und YouTube-Videos angeschaut, allerdings glaube ich in der Theorie nichts falsch gemacht zu haben. Ich muss irgendwo einen Denkfehler haben, den ich nicht blicke.

              Vielen Dank vorab.

              Code:
              <?php
              session_start();
              $token = uniqid("", true);
              $_SESSION["csrf_token"] = $token;
              
              if (isset($_POST["submit"])){
              if ($_POST["csrf"] == $token){
              $pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
              $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
              $statement->bindParam(":email", $_POST["email"]);
              $statement->execute();
              $count = $statement->rowCount();
              if ($count == 1){
              
              $row = $statement->fetch();
              if (password_verify($_POST["passwort"], $row["passwort"])){
              $_SESSION["username"] = $row["email"];
              header("Location: geheim.php");
              
              }
              else{
              echo "Login ist fehlgeschlagen.";
              }
              
              }
              else{
              echo "Login ist fehlgeschlagen.";
              }
              }
              else{
              die("Ungültiger Token");
              }
              }
              
              ?>
              <!DOCTYPE html>
              <html lang="de">
              <head>
              <title>Login</title>
              <meta charset="utf-8">
              </head>
              <body>
              <h1>Login</h1>
              <form action="login.php" method="post">
              <label for="email">E-Mail:</label>
              <input type="email" name="email" id="email" required><br>
              <label for="passwort">Paswort:</label>
              <input type="password" name="passwort" id="passwort" required><br>
              <input type="hidden" name="csrf" value="<?php echo $token ?>">
              <input type="submit" name="submit" id="submit" value="einlogeen">
              </form>
              
              </body>
              
              </html>

              Kommentar


              • #8
                Zitat von arnego2 Beitrag anzeigen

                Passworte machen Sonderzeichen eher Sinn und sind unabhängig der Programmierung. bei Usernamen da muss darauf achten das da keine Sonderzeichen drin sind die in der Programmierung auch genutzt werden.
                Dein Ernst? Wenn du Angst hast das so php Code in deiner Webseite eingeschleust wird, dann entwickelst du nicht richtig und hast keine klare Trennung der Schichten GUI / Logic / Data (Drei Schichten Architektur)
                Aber solche Trennungen kennen die wenigsten PHP Entwickler... Das kann man ja immer wieder in den geposteten Code Schnippseln erkennen. Auch Templates werden nicht benutzt. Wenn die Projekte größer werden können sie doch kaum mehr richtig gewartet werden. Alles auf einer php seite, login session, db querys und html / css. Aber wenn man sowas kann, darf man sich heute schon als Programmierer bezeichnen

                Kommentar


                • #9
                  Zitat von Hadrian9393 Beitrag anzeigen
                  In der Praxis bekomme ich leider nur den else Block mit "Ungültiger Token" angezeigt, jetzt habe ich mir verschiedene
                  Ist auch logisch
                  PHP-Code:

                  <?php
                  $token 
                  uniqid(""true);
                  $_SESSION["csrf_token"] = $token;
                  if (isset(
                  $_POST["submit"])){
                  if (
                  $_POST["csrf"] == $token){
                  Wenn du die Seite neu lädst ,was in deinen Fall ja so ist , wird ja wieder ein neuer Token erzeugt.
                  Deshalb ist bis
                  PHP-Code:
                  if ($_POST["csrf"] == $token){ 
                  Wieder ein neuer Token erzeugt wurden .
                  Du weiß aber das dein vorhaben aber so noch nicht ganz richtig ist oder ?
                  Zuletzt geändert von basti1012; 07.10.2020, 16:09.
                  Mein (Basti1012) Forum und Chat

                  Kommentar


                  • #10
                    Zitat von Testie Beitrag anzeigen

                    Dein Ernst? Wenn du Angst hast das so php Code in deiner Webseite eingeschleust wird, dann entwickelst du nicht richtig und hast keine klare Trennung der Schichten GUI / Logic / Data (Drei Schichten Architektur)
                    Aber solche Trennungen kennen die wenigsten PHP Entwickler... Das kann man ja immer wieder in den geposteten Code Schnippseln erkennen. Auch Templates werden nicht benutzt. Wenn die Projekte größer werden können sie doch kaum mehr richtig gewartet werden. Alles auf einer php seite, login session, db querys und html / css. Aber wenn man sowas kann, darf man sich heute schon als Programmierer bezeichnen
                    Mit mir hat es nichts zu tun, es ist uns passiert in einem Server der Cpanel hatte. Passiert auch bei Strato und bei Swisszone.
                    Zuletzt geändert von arnego2; 07.10.2020, 22:17. Grund: strato
                    https://arnego2.com <Webseiten, Umbau ab €80 und einiges mehr>

                    VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €37

                    Kommentar


                    • #11
                      Zitat von basti1012 Beitrag anzeigen
                      Ist auch logisch
                      PHP-Code:

                      <?php
                      $token 
                      uniqid(""true);
                      $_SESSION["csrf_token"] = $token;
                      if (isset(
                      $_POST["submit"])){
                      if (
                      $_POST["csrf"] == $token){
                      Wenn du die Seite neu lädst ,was in deinen Fall ja so ist , wird ja wieder ein neuer Token erzeugt.
                      Deshalb ist bis
                      PHP-Code:
                      if ($_POST["csrf"] == $token){ 
                      Wieder ein neuer Token erzeugt wurden .
                      Du weiß aber das dein vorhaben aber so noch nicht ganz richtig ist oder ?
                      Also muss ich dann die Zeilen, die den Token erstellen und in der Session speichern nachdem ich das eingegebene Passwort mit dem aus der Datenbank vergleiche, einbauen?

                      Mein Vorhaben ist nicht korrekt?
                      Also würde mir das gegen CSRF nicht helfen?

                      Kommentar


                      • #12
                        Du mußt den Token schon irgendwie speichern, sonst hast du bei jeden Reload einen neuen.
                        Der muß in einer session gespeichert werden.
                        Der darf aber auch nicht bei jeden reload neu gespeichert werden.
                        Deswegen würde eine empty Abfrage helfen.
                        PHP-Code:
                        <?php
                        session_start
                        ();
                        if (empty(
                        $_SESSION['csrf_token'])) {
                            
                        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
                        }
                        $token $_SESSION['csrf_token'];
                        if (isset(
                        $_POST["submit"])){
                            if(!isset(
                        $_POST["csrf_token"]) or !empty($_POST['csrf_token'])){
                                if(
                        $_POST['csrf_token']==$token){
                                
                        $error="Token ist ok";
                                
                        // hier dann weitere abfragen wie pw und co
                                
                        }else{
                                    
                        $error="Ungültiger Token";
                                }
                            }else{
                                
                        $error="Versuchte Manipulation erkannt";
                            }
                        }else{
                            
                        $error="Bitte Login Daten angeben";
                        }
                        echo 
                        $error;
                        ?>
                        <form method="post">
                            <label for="email">E-Mail:</label>
                            <input type="email" name="email" id="email" required><br>
                            <label for="passwort">Paswort:</label>
                            <input type="password" name="passwort" id="passwort" required><br>
                            <input type="hidden" name="csrf_token" value="<?=$token ?>">
                            <input type="submit" name="submit" id="submit" value="einlogeen">
                        </form>
                        So wäre mein Ansatz.
                        Ich bin auch kein Php Profi, deswegen hoffe ich auch koprrekturen wenn ich falsch liege.
                        Zuletzt geändert von basti1012; 07.10.2020, 23:34.
                        Mein (Basti1012) Forum und Chat

                        Kommentar


                        • #13
                          Vielen Dank für die Hilfe, ich werde die Lösungsvorschläge umsetzen.

                          Kommentar

                          homepage-forum.de - Hilfe für Webmaster! Statistiken

                          Einklappen

                          Themen: 56.712   Beiträge: 429.186   Mitglieder: 28.473   Aktive Mitglieder: 45
                          Willkommen an unser neuestes Mitglied, hautarztpraxisreytan.

                          Online-Benutzer

                          Einklappen

                          170 Benutzer sind jetzt online. Registrierte Benutzer: 0, Gäste: 170.

                          Mit 3.502 Benutzern waren am 23.01.2020 um 17:20 die meisten Benutzer gleichzeitig online.

                          Die neuesten Themen

                          Einklappen

                          Die neuesten Beiträge

                          Einklappen

                          • AGW
                            welches Webmail
                            Hallo,

                            ich nutze gerade Roundcube, aber irgendwie würde ich gerne ein anderes Webmail nutzen, nur welches? Könnt ihr welche empfehlen? Natürlich kostenlos.
                            21.10.2020, 14:04
                          • arnego2
                            Antwort auf welches Webmail
                            Ist eigentlich egal welche App du nutzt wenn du ein Email Programm nutzt wie Thunderbird, Outlook....
                            Gestern, 20:18
                          • Localfu
                            Adobe Flash umbenennen
                            Da Adobe den Flashplayer ab 31. Dezember nicht mehr zur verfügung stellt, könnte man überlegen, dass man diese Sparte umbenennt. Mein Vorschlag wäre HTML5 Animation und Video.
                            Gestern, 18:17
                          • silent
                            Diashow
                            Guten Tag,
                            ich möchte in meiner rechten Div ein Informations-Panal hinzufügen, welches man mit Bildern jederzeit updaten kann. Die Bilder sollen per Diashow angezeigt werden. Das funktioniert auch alles reibungslos. Mein Problem ist es, das ich das nicht hinbekomme, dass sich die Bilder automatisch...
                            20.10.2020, 09:13
                          • daniel5959
                            Antwort auf Diashow
                            Hallo,

                            ich muss da aussteigen - betrifft auch gesendete Nachricht an mich - und es den CSS-, JS und PHP-Experten überlassen.

                            daniel5959
                            Gestern, 15:03
                          • silent
                            Antwort auf Diashow
                            Update:

                            Ich bin mittlerweile soweit, dass ich die Inhalte automatisch aus dem Ordner beziehen kann. Nach den empfehlungen von Sempervivum und eigener recherche, bin ich soweit, dass ich das versuchen werde, mit Javascript zu verwirklichen (automatische Diashow).


                            Code...
                            Gestern, 14:56
                          • Hadrian9393
                            Loginscript funktioniert nicht
                            Hallo PHP- und SQL-Profis,

                            ich habe ein Loginscript getestet, dieses funktioniert allerdings nicht wie gewünscht.

                            <?php
                            session_start();
                            $pdo = new PDO("mysql:host=localhost;dbname=php-einfach", "root", "");
                            ?>
                            <!DOCTYPE...
                            28.09.2020, 17:55
                          • Hadrian9393
                            Antwort auf Loginscript funktioniert nicht
                            Vielen Dank für die Hilfe, ich werde die Lösungsvorschläge umsetzen.
                            21.10.2020, 19:39
                          • Sempervivum
                            Antwort auf Diashow
                            Guten Morgen silent, ich hatte die Lösung schon gepostet, aber das Forum hier hat einen Spamfilter und der hat dieses Posting zunächst gesperrt. Vermutlich weil zwei Links darin waren. Es muss von einem Moderator/Admin erst frei gegeben werden. Ich versuche es Mal ohne Links per privater Nachricht...
                            21.10.2020, 07:45
                          • silent
                            Antwort auf Diashow
                            Guten Morgen Sempervivum ,
                            wie meinst du das?
                            Du musst mir ja nicht die Lösung direkt sagen, du könntest mich auch einfach auf den richtigen Weg bringen.

                            VG
                            21.10.2020, 07:36
                          Lädt...
                          X