mario: Abgleichung von Username/Passwort mit DB; Fehler in if-Abfrage?

Moin,

ich hab n Script, das überprüft, ob der eingegebene Benutzername und Passwort mit den Einträgen aus der Datenbank übereinstimmen.

Wenn ja, kommt die Meldung "Benutzername und Passwort sind richtig.". Wenn nein, dann soll die Meldung kommen "Benutzername/Passwort FALSCH!".

Aber irgendwas stimmt hier wohl nicht... wenn die Eingaben richtig sind, komme ich zu meiner Meldung. Wenn der Benutzername richtig ist, aber das Passwort falsch, dann bringt er auch die FALSCH-Meldung. Wenn aber auch der Benutzername falsch ist, dann verschwindet mein Formular und ich sehe eine leere Seite.

<?
  include("../include_sqlconnect.php"); // Verbindung zur DB
  if($user) {
  $abfrage = "SELECT * FROM login WHERE username = '$user'";
  $ergebnis = mysql_query($abfrage);
    while ($row = mysql_fetch_array ($ergebnis))
    {
 if ($user == $row[username] AND $password == $row[password]) {
     echo "Benutzername und Passwort sind richtig.";
 } else {
 echo "Benutzername/Passwort FALSCH!";}}
  } else {
  echo "Hier ist das Eingabe-Formular";}}
?>

  1. Hallo,

    nach bissl rumüberlegen hab ich's glaub ich.

    Der kleine Denkfehler:

    $abfrage = "SELECT * FROM login WHERE username = '$user'";

    Wenn der $user (ist ja wohl die Eingabe) falsch ist, dann ist das Resultat der Anfrage leer. Folglich läuft Deine whileschleife gar nicht an.

    Grüße aus Würzburg
    Julian

  2. Hi,

    if($user) {

    hast Du diese Variable vorher mit

    $user = $_POST['user'];

    initialisiert? Wenn nicht, gehst Du gerade ein evtl. nicht unerhebliches Sicherheitsrisiko ein.

    $abfrage = "SELECT * FROM login WHERE username = '$user'";

    Hiermit hat sich dies:

    if ($user == $row[username]

    erledigt, es ist implizit. Auf gleichem Weg kannst Du auch bereits im SQL-Statement dies:

    AND $password == $row[password]) {

    abfackeln.

    echo "Benutzername und Passwort sind richtig.";

    Testausgaben zum manuellen Vergleich:
    echo $password
    echo $row[password]

    Wo hast Du eigentlich password definiert, und meinst Du nicht in Wirklichkeit 'password'?

    Cheatah

    1. if($user) {

      hast Du diese Variable vorher mit

      $user = $_POST['user'];

      initialisiert? Wenn nicht, gehst Du gerade ein evtl. nicht unerhebliches Sicherheitsrisiko ein.

      Was bringt mir der Befehl? Bzw. was bedeutet er?

      $abfrage = "SELECT * FROM login WHERE username = '$user'";

      Hiermit hat sich dies:

      if ($user == $row[username]

      erledigt, es ist implizit.

      Jepp stimmt... war wohl n kleiner Denkfehler drin.

      Wo hast Du eigentlich password definiert, und meinst Du nicht in Wirklichkeit 'password'?

      Ganz unten im Script steht, dass ein Formular definiert wird. Dort sind 2 Eingabefelder enthalten, eines heisst $user und eines $password... daher kriege ich diese Variablen.

      Grüsse
      Mario

      1. Hi,

        $user = $_POST['user'];
        Was bringt mir der Befehl? Bzw. was bedeutet er?

        $_POST ist ein assoziatives Array (kein Befehl), welches die POST-Parameter des Requests enthält; das Gegenstück ist $_GET für die URL-Parameter. Es bringt Dir den Verzicht auf sinnfrei in den globalen Namespace gehauene Variablen mit dynamischen Namen, welche zudem aus mehreren Quellen stammen (URL-, POST-Parameter, Environment), so dass Du absolut keine Ahnung haben kannst, auf welche Weise ein böswilliger Hacker die Daten manipuliert haben mag.

        Wo hast Du eigentlich password definiert, und meinst Du nicht in Wirklichkeit 'password'?

        Ganz unten im Script steht, dass ein Formular definiert wird.

        Das erzeugt noch lange keine Konstante namens password am _Anfang_ des Scripts. Lies bitte meine Frage noch mal etwas genauer, und achte dabei auf Details.

        Dort sind 2 Eingabefelder enthalten, eines heisst $user und eines $password... daher kriege ich diese Variablen.

        Nein, sie heißen nicht so, und über HTTP *werden* *keine* *Variablen* *übertragen*. Es ist ein erhebliches Sicherheitsrisiko, aus Parametern magisch Variablen erzeugen zu lassen. Benutze *niemals* "$submit", nur weil irgendwo _eventuell_ ein <input name="submit"> mal hätte gewesen sein können. Benutze *ausschließlich* $_GET['submit'] bzw. $_POST['submit'], je nach Formular-Methode. Greife auf Umgebungsvariablen *ausschließlich* mittels getenv() oder ähnlicher gekapselter Mechanismen zu, *niemals* über $USER_AGENT oder ähnliche Variablen. Idealerweise konfigurierst Du Deinen Server so, dass sowas überhaupt nicht erst erzeugt wird.

        Cheatah