Garret: Benutzeranmeldung mit PHP und mySQL

Hallo!

Ich bin dabei eine Benutzer anmeldung mit PHP und mySQL zu programmiere.

Jedoch stehe ich irgendwie auf dem Schlauch und komme nicht weiter!

Also, die anmeldung sollte wie folgt aussehen:
Alles ist in einer Datei (phx.php)
Wenn die aufgerufen wird zeigt sie erst nur ein
Benutzername und Passwort eingabe feld.
Wird etwas falsches angegeben wird über eine if(isset='') anweisung ein "Falscher Login" usw. ausgegeben.

Bei einem Richtigen Login, wird eben auch über eine if(isset='') anweisung der Programmteil gestartet, mit dem man dann zugriff auf erweiterte dinge bekommt.

Sooo, die Datei läuft auch tadellos, ABER:
Nur wenn ich bei der Benutzer und Passwort abfrage schon ein richtiges ergebniss in die datei einbaue.
also:

"if ($_POST['Benutzer']=='pad01')"

zum beispiel.

Allerdings will ich, das das Programm die beim Login eingegebenen daten ($_POST['Benutzer']) mit einer mySQL tabelle vergleicht, und wenn das eigegebene Passwort und Benutzername auch in der Tabelle vorhanden ist, soll das Progamm da weitermachen.

Und genau da heng ich im moment.

Ich weiß einfach nicht wie die richte mySQL anweisung ist!
Die Datenbank ist vorhanden, die Datei läuft bei fest eingegebenen testwerten für den Benutzer und das Passwort auch einwandfrei.

Aber einen weg um die fixen testwerten mit einer möglichkeit, dynamisch die mySQL tabelle zu durchsuchen habe ich noch nicht gefunden.

Vieleicht kann mir hier jemand helfen?

  1. SELECT * FROM nutzertabelle WHERE nutzername = '{user}' AND passwort = '{passwort}'

    Wenn es einen Treffer gibt, dann ist dein Login gültig, wenn nicht, dann nicht.

    1. Hallo!

      SELECT * FROM nutzertabelle WHERE nutzername = '{user}' AND passwort = '{passwort}'

      Wenn es einen Treffer gibt, dann ist dein Login gültig, wenn nicht, dann nicht.

      Wobei er sich vor einer SQL-Injektion schützen sollte.

      ciao, ww

      --
      Schäuble:
        "Wir können alles. Außer Rechtsstaat."
      1. Hallo!

        SELECT * FROM nutzertabelle WHERE nutzername = '{user}' AND passwort = '{passwort}'

        Wenn es einen Treffer gibt, dann ist dein Login gültig, wenn nicht, dann nicht.

        Wobei er sich vor einer SQL-Injektion schützen sollte.

        ciao, ww

        Und wie schütze ich mich am besten davor? der Wikipedia artikel hat mir da nicht so sehr viel weitergeholfen.

        Ich hab jetzt nochmal etwas an dem mySQL code herumgedoktort, aber ich komme da nicht weiter.

        so sieht die überprüfung bis jetzt aus:

        if (isset($_POST['set']))
         {
          $ben = $_POST['Benutzer'];
          $pass = $_POST['Pw'];

        mysql_connect(localhost, ***, "***");
          mysql_select_db("***");
          $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$pass'");
          $num = mysql_num_rows($res);

        echo mysql_result($res, 0); // Nur ein test

        echo "<form action = 'phx.php' method = 'post'>";

        if ($_POST['Benutzer']=='pad01' && $_POST['Pw']=='pa')
          {

        Ich weiß einfach nicht wie ich die mySQL anweisung in die If schleife einbinden kann!

        Ich hab schon versucht zuerst mySQL nach dem Benutzernamen suchen zu lassen, und das was gefunden wird in eine variable speichern zu lassen damit ich die dann zum vergleichen in die If schleife einbauen kann. aber ohne erfolg ... außerdem würde ja dann der bezug zwischen Benutzer und passwort verloren gehen...

        Irgendwie komme ich mit mySQL an der stelle überhaupt nicht weiter

        1. Und wie schütze ich mich am besten davor? der Wikipedia artikel hat mir da nicht so sehr viel weitergeholfen.

          PHP bietet dafür die Funktion mysql_real_escape_string ...

          $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$pass'");

          ... und hier sollte sie auf die Variablen angewendet werden.

          $num = mysql_num_rows($res);
          Ich weiß einfach nicht wie ich die mySQL anweisung in die If schleife einbinden kann!

          Naja, mit num_rows bestimmst du die Anzahl der zurückgelieferten Ergebnisse.
          Wenn die Anzahl 0 ist, existiert die Benutzer/Passwort - Kombi nicht.
          Und das wäre auch schon die if-Bedingung.

          Gruß, Volker

          1. Ja du hast recht, ist eigentlich total simpel^^ hat einfach auf dm schlauch gestanden.

            Der Programteil sieht jetzt so aus:

            $ben = $_POST['Benutzer'];
            $pass = $_POST['Pw'];

            mysql_connect(localhost, ***, "***");
            mysql_select_db("***");
            $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$pass'",
            mysql_real_escape_string($ben),
            mysql_real_escape_string($pass));
            $num = mysql_num_rows($res);

            Jedoch nimmt er jetzt gar kein benutzer mehr an.
            Ohne das mysql_real_escape_string() geht es wunderbar.

            1. $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$pass'",
              mysql_real_escape_string($ben),
              mysql_real_escape_string($pass));

              Falsche Reihenfolge. _Zuerst_ kritische Zeichen escapen, _danach_ den SQL-Query starten.

              Jedoch nimmt er jetzt gar kein benutzer mehr an.
              Ohne das mysql_real_escape_string() geht es wunderbar.

              Voraussetzung: Auch das Einfügen des Benutzernamens und Passwort ist mit mysql_real_escape_string passiert.

              Eine grundsätzliche Überlegung: Ich hoffe, du hast das Passwort nicht als Klartext in der Datenbank gespeichert, sondern als Hash?!

              Gruß, Volker

              1. Achso, danke :)

                Der Code geht jetzt einwandfrei:

                $ben = $_POST['Benutzer'];
                $pass = $_POST['Pw'];

                mysql_real_escape_string($ben);
                mysql_real_escape_string($pass);

                mysql_connect(localhost, ***, "***");
                mysql_select_db("***");
                $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$pass'");
                $num = mysql_num_rows($res);

                if ($num=='1')
                {

                Im moment ist alles als Klartext in der Datenbank.
                sorry ich bin noch anfänger^^
                Wie erstell ich den einen Hash?

                1. Hallo!

                  Wie erstell ich den einen Hash?

                  -> http://de.php.net/manual/de/function.md5.php
                  -> http://de.php.net/manual/de/ref.hash.php

                  ciao, ww

                  --
                  Schäuble:
                    "Wir können alles. Außer Rechtsstaat."
                  1. Hallo!

                    Also das anmelden funktioniert 1a :-) vielen dank euch allen!
                    Hier nochma der (fast) komplette code, fals ihr da noch lücken findet:

                    Es gibt eine Registier Datei, in der jeder Email, Name und Passwort angibt. Mit einem Button wird mir dann eine eMail mit Name, Mail und das mit MD5 verschlüsselte Passwort zugesannt.
                    Der bequemlichkeit halber ist in der Mail gleich eine URL angegeben die die 3 Variablen eingebettet hat.

                    Die URL führt zu einer datei (per .htacces gesichert) in der ein Forumlar für Name, Passwort usw. ist. Dank der URL sind die felder aber auch gleich richtig ausgefüllt und es braucht nur einen knopf zum bestätigen und die daten werden in die mySQL datenbank geschrieben.

                    So, anschließend kann man sich mit der Login datei einloggen, wie folgt:

                    (Zuerst kommt ein kleines Forumlar zum Benutzername und Passwort erfassen.
                    Der "Einlogen" Button löst dann diesen Code aus:)

                    if (isset($_POST['set']))
                    {
                    $ben = $_POST['Benutzer'];
                    $pass = $_POST['Pw'];

                    mysql_real_escape_string($ben);
                    mysql_real_escape_string($pass);

                    $Npass = MD5($pass);

                    mysql_connect(localhost, ***, "***");
                    mysql_select_db("***");
                    $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$Npass'");
                    $num = mysql_num_rows($res);

                    if ($num=='1')
                    {

                    1. Moin!

                      Also das anmelden funktioniert 1a :-) vielen dank euch allen!

                      Bis auf das SQL-Injection-Thema. Das hast du immer noch nicht geblickt - bist jetzt aber voller Hoffnung, es wäre gelöst, was ein fataler Irrtum ist. Peinlich, dass das keiner der bisherigen Threadteilnehmer bemerkt hat.

                      Ich kommentiere mal, was mir arg auffällt:

                        
                      
                      > if (isset($_POST['set']))  
                      > {  
                        
                      // Kopiere niemals Werte aus $_POST, $_GET, $_COOKIE in eigene Variablen. Zwei Gründe: 1. Verbraucht es sinnlos Speicherplatz. 2. Signalisiert der GROSS geschriebene Variablenname "GEFAHR! Manipulierbare Benutzereingabe, muss immer passend escaped werden!".  
                        
                      
                      > $ben = $_POST['Benutzer'];  
                      > $pass = $_POST['Pw'];  
                      
                      // Diese zwei Zeilen also bitte löschen. Nutze direkt $_POST['Benutzer'] etc.  
                        
                      // Die Sicherheitslücke ist das hier:  
                      
                      > mysql_real_escape_string($ben);  
                      > mysql_real_escape_string($pass);  
                      
                      // Mysql gibt als Funktionsergebnis den escapten String zurück, den man weiterverwenden muß, indem man ihn beispielsweise in einer Variablen speichert. Das tust du hier nicht! Die zwei Zeilen also bitte auch löschen.  
                        
                      
                      > $Npass = MD5($pass);  
                      
                      // Die Funktion MD5() funktioniert genauso, wie mysql_real_escape_string() - und die kannst du auf einmal richtig anwenden! Aber das Behandeln von Daten sollte zentral und ohne unnötige neue Variablen passieren.  
                        
                      
                      > mysql_connect(localhost, ***, "***");  
                      > mysql_select_db("***");  
                      > $res = mysql_query("select * from Mitglieder where Name = '$ben' and Pw = '$Npass'");  
                      
                      // Umgekehrt ist es aus Debugging-Gründen extrem sinnvoll, den SQL-String in einer eigenen Variablen zu speichern und die Variable dann an mysql_query() zu übergeben.  
                        
                      // Also neuer Code:  
                      // 1. SQL zusammensetzen:  
                      $sql = "SELECT * FROM Mitglieder WHERE Name = '".mysql_real_escape_string($_POST['Benutzer'])."' AND Pw = '".mysql_real_escape_string(md5($_POST['Pw']))."'");  
                        
                      // 2. Query abschicken und im Fehlerfall Skript mit Meldung abbrechen (Hardcore-Methode während der Entwicklungszeit - schöner wäre, mit $res === false zu prüfen, ob der Query fehlerhaft war, und dann netter zu verzweigen).  
                      $res = mysql_query($sql) or die ("SQL-Query: ".$sql." mit Fehler ".mysql_error());  
                        
                      
                      > $num = mysql_num_rows($res);  
                      
                      

                      - Sven Rautenberg

                      --
                      "Love your nation - respect the others."
                      1. Peinlich, dass das keiner der bisherigen Threadteilnehmer bemerkt hat.

                        Als ich mir das Posting eben durchgelesen habe, hab ich es bemerkt, ätsch ;-).

                        // Also neuer Code:
                        // 1. SQL zusammensetzen:
                        $sql = "SELECT * FROM Mitglieder WHERE Name = '".mysql_real_escape_string($_POST['Benutzer'])."' AND Pw = '".mysql_real_escape_string(md5($_POST['Pw']))."'");

                        Besonders das Verwenden von mysql_real_escape_string direkt in der SQL-Query kann ich nur empfehlen. Damit bemerkt direkt ein evtl. Fehlen der escape-Funktion und muss nicht den halben Code durchwühlen um zu prüfen, ob die Variablen korrekt gesäubert wurden.

                        Gruß, Volker

                      2. Oh .. das mit dem escapet string hätt ich eigentlich bemerken müssen ..

                        Zum SQL-String:
                        Ja, normalerweise hab ich auch alle mySQL anweisunge erst in einer Variablen gespeichert, habs hier aber vegessen/vernachlässigt.

                        Es ist wirklich fanzinieren das man alles an Sicherheits aspekten noch in eine Simple seite einbauen muss.

                        Das mit den mehreren Variablen ist zwar unnötig aber da ich noch relativer Webdesign Anfänger bin (1 Jahr lang beim diesjähren ABI gelernt) bau ich meine Seiten immer möglichst übersichtlich und nicht so stark verschachtelt.

                        Aber ich danke für die Tipps :D

                        Der neue, schlanke Code sieht wie folgt aus:

                        if (isset($_POST['set']))
                        {
                        mysql_connect(localhost, ***, "***");
                        mysql_select_db("***");

                        $sqlab = "select * from Mitglieder where Name = '" . mysql_real_escape_string($_POST['Benutzer']) . "'";
                        $sqlab .= "and Pw = '" . mysql_real_escape_string(MD5($_POST['Pw'])) . "'";

                        $res = mysql_query($sqlab) or die ("SQL-Query: ".$sql." mit Fehler ".mysql_error());
                        $num = mysql_num_rows($res);

                        if ($num=='1')
                        {

                        Noch ne kleine Frage, ich habe ja bei dieser Seite, alle einzel funktionen in eine Datei gepackt.

                        Und damit das "Bitte geben sie Benutzernamen und Passwort ..." fenstern nicht andauernd unten angezeigt wird, hab ich da ebenfalls etwas drangebastelt:

                        if (isset($_POST['set2']) || isset($_POST['set3']) || isset($_POST['set4']))
                        {
                         unset($Anfang);
                        }
                        else
                        {
                         $Anfang='1';
                        }

                        if (isset($Anfang))
                        {
                         [Das anmelde Eingabe Formular]
                        }

                        Gibt es da evt. ne schlankere alternative oder gibts da vieleicht sogar Sicherheits Lücken?

    2. SELECT * FROM nutzertabelle WHERE nutzername = '{user}' AND passwort = '{passwort}'

      Wenn es einen Treffer gibt, dann ist dein Login gültig, wenn nicht, dann nicht.

      Ja das hatte ich schon Probiert, aber könnest du mir evt. noch eine genau schleife sagen wie ich das einbau das es auch Funktioniert?^^

      if((SELECT * FROM nutzertabelle WHERE nutzername = '{user}' AND passwort = '{passwort}')='True')

      Oder sowas

  2. Hallo!

    Wenn die aufgerufen wird zeigt sie erst nur ein
    Benutzername und Passwort eingabe feld.

    Soweit ok.

    Wird etwas falsches angegeben wird über eine if(isset='') anweisung ein "Falscher Login" usw. ausgegeben.

    Du weißt schon, was isset macht? Das hat nicht, wirklich *gar nichts* mit einem Login zu tun. Wenn du nur mit isset überprüfst, dann kann man jeden Wert eintragen.

    Bei einem Richtigen Login, wird eben auch über eine if(isset='') anweisung der Programmteil gestartet, mit dem man dann zugriff auf erweiterte dinge bekommt.

    Könntest du vielleicht Quelltext zeigen? Aber deine Beschreibung hört sich katastrophal an.

    Sooo, die Datei läuft auch tadellos, ABER:

    Das "tadellos" bezweifel ich ;-)

    Ich weiß einfach nicht wie die richte mySQL anweisung ist!

    Schau dir die MySQL-Funktionen von PHP an. Dann probiere es aus. Wenn es nicht klappt, dann helfen wir dir weiter.

    Die Datenbank ist vorhanden, die Datei läuft bei fest eingegebenen testwerten für den Benutzer und das Passwort auch einwandfrei.

    Zeige doch bitte deinen Code.

    Aber einen weg um die fixen testwerten mit einer möglichkeit, dynamisch die mySQL tabelle zu durchsuchen habe ich noch nicht gefunden.

    Siehe PHP-Handbuch -> MySQL-Funktionen.

    Vieleicht kann mir hier jemand helfen?

    ciao, ww

    --
    Schäuble:
      "Wir können alles. Außer Rechtsstaat."
  3. Hier mal ein auszug aus dem jetzigen Code:
    Zuerst wird der Teil aus dem Programm aufgerufen:

    <?php
     echo "<form action = 'phx.php' method = 'post'>";
     echo "<input name='Benutzer'>Benutzername<p>";
     echo "<input name='Pw'>Passwort<p>";

    echo "<input type='submit' name='set'>";
     echo "<input type='reset'>";
    ?>

    Und bei einem Klick auf dem Button dann:

    <?php

    if (isset($_POST['set']))
     {
      echo "<form action = 'phx.php' method = 'post'>";

    if ($_POST['Benutzer']=='pad01')
      {
       echo "<font color='green'>Login OK</font><p>";
       echo "<input type='submit' name='set2' value='Charakter erstellen'><br><br><br>";
      }
      else
      {
       echo "<center>";
       echo "<br><br><br><br><br>";
       echo "<table border='1' bordercolor='red'>";
       echo "<tr><td>";
       echo "<center>";
       echo "<font color='red'><b>::Fehler::</b></font>";
       echo "<br><br>";
       echo "<div><font color='red'>::</font> Falsche Eingabe oder Benutzer noch nicht freigeschaltet <font color='red'>::</font></div>";
       echo "</center>";
       echo "</td></tr>";
       echo "</table>";
       echo "<br><br><br>";
       echo "</center>";
      }
     }
    ?>