Bug in LoginSkript

Dolphon

Erfahrenes Mitglied
Moin. Als ich heute ein bisschen an meinem Login-Skript gespietl habe, ist mir eine Fehelr aufgefallen, den ich nicht behoben bekomme.
Ich kann jede Art von Kombination eingeben. nur Benutzernamen, oder nur PW, oder einen flaschen Benutzer + PW, bekomme dann wie es sein soll, eine Fehlermeldung.
Gebe ich aber einen gültigen Benutzernamen ein, und ein x-beliebiges PW(was falsch ist), so werde ich eingeloggt, statt eine Fehlermeldung zu erhalten.

Hier mal der Code:


PHP:
<?php 
require("config.inc.php"); 

if(!($db = mysql_connect($db_host, $db_user, $db_pass))) //baue datebankverbindung auf 
  die(mysql_error());  //wenn nicht geht, gib fehlermeldung aus 
else //wenn doch geht 
{ 
  if(!mysql_select_db($db_name, $db)) //wähle datenbank aus 
      die(mysql_error());   //wenn das nicht geht, gib fehler aus 
} 

if(!$_POST['username'] || $_POST['username'] == "") { 
  echo '<p align="center">Sie haben keinen Benutzernamen eingegeben!<br><br><a href="index.php">Zurück</a></p>'; 
}elseif(!$_POST['password'] || $_POST['password'] == "") { 
  echo '<p align="center">Ein Passwort brauchen wir schon ;-)<br><br>'; 
}else{ 
  $passwort = md5($_POST['$password']); 
  $query = @mysql_query("SELECT id, user, pw, gewerbe, email, vorname, nachname, straße, hnr, plz, ort, frei  FROM handwerker WHERE user = '".$_POST['username']."'") or die('Select ist 
fehlgeschlagen!'); 
  $result = @mysql_fetch_object($query) or die('<p align="center">Sorry, aber dieser Benutzername existiert nicht!<br><a 
href="index.php">Zurück</a></p>'); 


if ($_POST['username']==$result->user && $passwort==$result->pw) { 

    echo '<p align="center">Sorry, aber dieses Passwort ist falsch!<br><br>'; 
    die;
  }else{
    $_SESSION["id"] = $result->id;
    $_SESSION["user"] = $result->user;
    $_SESSION["gewerbe"] = $result->gewerbe;
    $_SESSION["email"] = $result->email;
    $_SESSION["vorname"] = $result->vorname;
    $_SESSION["nachname"] = $result->nachname;
    $_SESSION["straße"] = $result->straße;
    $_SESSION["hnr"] = $result->hnr;
    $_SESSION["plz"] = $result->plz;
    $_SESSION["ort"] = $result->ort; 
    $_SESSION["frei"] = $result->frei;

if($_SESSION["gewerbe"] == '2')
{
    echo '<p align="center">Login erfolgreich!<br><br><a href="interna.php?'.session_name().'='.session_id().'">Weiter</a></p>'; 
}
else
{
    echo '<p align="center">Login erfolgreich!<br><br><a href="intern.php?'.session_name().'='.session_id().'">Weiter</a></p>';     
} 
} }
?>
 
Na mein Freund...

Schau doch mal in Zeile: 18

Code:
$query = @mysql_query("SELECT id, user, pw, gewerbe, email, vorname, nachname, straße, hnr, plz, ort, frei  FROM handwerker WHERE user = '".$_POST['username']."'") or die('Select ist 
fehlgeschlagen!');

Bisher hast Du gesagt, dass er Dir alle Inhalte aus der DB holen soll, die unter dem Usernamen stehen... (Falls dieser in der DB vorhanden ist)

DAS PASSWORT WIRD NICHT GEPRÜFT!

Danach kommt irgendwie quatsch... ;-)

Code:
if ($_POST['username']==$result->user && $passwort==$result->pw) { 

    echo '<p align="center">Sorry, aber dieses Passwort ist falsch!<br><br>'; 
    die; 
  }else{ 
    $_SESSION["id"] = $result->id; 
    $_SESSION["user"] = $result->user; 
    $_SESSION["gewerbe"] = $result->gewerbe; 
    $_SESSION["email"] = $result->email; 
    $_SESSION["vorname"] = $result->vorname; 
    $_SESSION["nachname"] = $result->nachname; 
    $_SESSION["straße"] = $result->straße; 
    $_SESSION["hnr"] = $result->hnr; 
    $_SESSION["plz"] = $result->plz; 
    $_SESSION["ort"] = $result->ort; 
    $_SESSION["frei"] = $result->frei; 

if($_SESSION["gewerbe"] == '2') 
{ 
    echo '<p align="center">Login erfolgreich!<br><br><a href="interna.php?'.session_name().'='.session_id().'">Weiter</a></p>'; 
} 
else 
{ 
    echo '<p align="center">Login erfolgreich!<br><br><a href="intern.php?'.session_name().'='.session_id().'">Weiter</a></p>';      
} 
} }

Da steht:

wenn USER und PASS richtig sind, soll er Dir eine Fehlermeldung ausgeben!

Sorry, aber dieses Passwort ist falsch

Logik! :mad:

Wenn der User allerdings richtig- und das Passwort falsch ist, gelangt man in den ELSE Zweig. Dort werden die $ der Session gefüllt und man gelangt in den "geschützten" Bereich...

Schau dir das nochmal ganz genau an.

Man neigt schnell dazu einfach "los zu programmieren" jedoch sollte man sich in der Konzeptions-Phase etwas länger aufhalten.

Beste Grüße aus Gütersloh,
Claus Gronemeier
 
Ich muss mal noch nachtragen, dass ich es nicht gut finde dem Nutzer zu viele Informationen beim Einloggen zukommen zu lassen. Wenn jemand versucht reinzukommen, bekommt er dann nach ein paar Versuchen mitgeteilt, dass er einen gültigen User-Namen gefunden hat und nur noch das Passwort finden brauch.

Besser finde ich, wenn man einfach den Datensatz aus der Datenbank holt, der den Nutzernamen und das Passwort hat. Kommt genau 1 Datensatz zurück, ist der Nutzer erkannt, ansonsten wird ausgegeben, dass der Login-Versuch fehlgeschlagen ist.

snuu
 
Danke für die Antwort, hab mal ein bisschen was verstellt, aber laufen tuts noch nicht richtig.

@snuu
warum soll ich mir das hier nochmal anschauen?
PHP:
$passwort = md5($_POST['$password']);
Was die Sache mit den Rückgeworfenen Meldungen betrifft, kann ich diese ja noch ändern, bevor es zum Einsatz kommt.

Irgendwas stimmt mit dem PW nicht. WEnn ich das PW schon im Query Abfrage kommt imemr die Meldung das der Benutzer nicht existiert, weil das PW nicht übereinstimmt. das gleich gilt für die 2. IF Abfrage. Komme da nicht so wirklich weiter. weil das PW ja mit md5 in der Datenbank steht, und ich mich bestimmt nicht vertippe beim eingeben.


PHP:
if(!$_POST['username'] || $_POST['username'] == "") { 
  echo '<p align="center">Sie haben keinen Benutzernamen eingegeben!<br><br><a href="index.php">Zurück</a></p>'; 
}elseif(!$_POST['password'] || $_POST['password'] == "") { 
  echo '<p align="center">Ein Passwort brauchen wir schon ;-)<br><br>'; 
}else{ 
  $passwort = md5($_POST['$password']); 
  $query = @mysql_query("SELECT id, user, pw, gewerbe, email, vorname, nachname, straße, hnr, plz, ort, frei  FROM handwerker WHERE user = '".$_POST['username']."'") or die('Select ist 
fehlgeschlagen!'); 
  $result = @mysql_fetch_object($query) or die('<p align="center">Sorry, aber dieser Benutzername existiert nicht!<br><a 
href="index.php">Zurück</a></p>'); 
 

if ($_POST['username']==$result->user && $passwort==$result->pw) { 


    $_SESSION["id"] = $result->id;
    $_SESSION["user"] = $result->user;
    $_SESSION["gewerbe"] = $result->gewerbe;
    $_SESSION["email"] = $result->email;
    $_SESSION["vorname"] = $result->vorname;
    $_SESSION["nachname"] = $result->nachname;
    $_SESSION["straße"] = $result->straße;
    $_SESSION["hnr"] = $result->hnr;
    $_SESSION["plz"] = $result->plz;
    $_SESSION["ort"] = $result->ort; 
    $_SESSION["frei"] = $result->frei;

if($_SESSION["gewerbe"] == '2')
{
    echo '<p align="center">Login erfolgreich!<br><br><a href="interna.php?'.session_name().'='.session_id().'">Weiter</a></p>'; 
}
else
{
    echo '<p align="center">Login erfolgreich!<br><br><a href="intern.php?'.session_name().'='.session_id().'">Weiter</a></p>';     
} 

}else{
    echo '<p align="center">Sorry, aber dieses Passwort ist falsch!<br><br>'; 
    die;
  
}}
?>
 
Original geschrieben von Dolphon

warum soll ich mir das hier nochmal anschauen?

PHP:
$passwort = md5($_POST['$password']);

Der Fehler ist hier schon richtig. So muss es aussehen:
PHP:
$passwort = md5($_POST['password']);
Original geschrieben von Dolphon

Irgendwas stimmt mit dem PW nicht. WEnn ich das PW schon im Query Abfrage kommt imemr die Meldung das der Benutzer nicht existiert, weil das PW nicht übereinstimmt.
Das Problem dürfte sich durch die Berichtigung oben auflösen. Insgesamt denke ich könnte man das ganze Script enorm einfacher und vor allem kürzer gestalten.
 
Zurück