Abfrage aus Datenbank -> Vergleich mit eingegebenen Werten...

Wolfilein

Grünschnabel
Hallo zusammen,
ich versuche gerade PHP zu lernen und bin dabei einen LogIn zu schreiben. Ich habe schon diverse Werte in der Datenbank. Unter anderem "username" und "passwort". Jetzt übergebe ich den Benutzername und das Passwort, welches eingegeben wurde auf der startseite an meine Datei check.php. Hier soll er jetzt das eingegebene Passwort mit dem in der Datenbank unter dem Benutzernamen vergleichen. In diesem Fall funktioniert auch alles (Übergabe der Werte, richtige Daten werden ausgelesen). Eingegebenes Passwort und Passwort in der Datenbank sind auch identisch. Nur bei meiner IF-Abfrage sagt er, dass diese ungleich sind. Vielleicht kann mir jemand von euch helfen, die Suchfunktion brachte mich nicht weiter. Schonmal vielen Dank.

Dies ist meine check.php


<?php

include 'connect.php';

$benutzername = $_POST["benutzername"];
$passwort = $_POST["passwort"];
$passwort = md5($passwort);



$result=mysql_query("SELECT username,passwort FROM kartenhauser WHERE username='$benutzername'");
while($row=mysql_fetch_array($result))
{
echo $row[username];
echo "<br />";
echo $row[passwort];
echo "<br />";
echo $passwort;
echo "<br />";
}

$passwort2 = $row[passwort];

if ($passwort==$passwort2)
{
echo "Das Passwort ist korrekt";
}
else echo "Das Passwort ist Falsch";

?>
 
Vergleichst Du das Passwort aus der Datenbank (in Klartext?) mit dem MD5-verschlüsselten Passwort? Die sind verschieden.

Ich habe genau dieses Thema ausführlich im Tutorial "geschützte Seiten" beschrieben.
 
So etwas mitten im Code mit if zu machen ist eine Möglichkeit, die aber oft auch Sicherheitslücken mit sich bringen.

Auf dein Script kann ein ganz geübter einen Angriff so ausführen, dass die SQL-Abfrage fehl schlägt und er trotzdem angemeldet ist (sofern register_globals aktiviert ist - oft der Fall).

Zunächst für die Sicherheit schickst du das was man dir sendet und du in SQL verwenden willst durch die Funktion mysql_real_escape_string() :
PHP:
$passwort = mysql_real_escape_string($_POST["passwort"]);
Benutzername äquivalent. Dies verhindert SQL-Injections (einfach mal googlen).

Dazu musst du höchst wahrscheinlich auch md5() nutzen. Die Passwörter im Klartext in der Tabelle zu haben ist ebenfalls unsicher. Wenn einer an die Tabelle kommt weil er nur dein Passwort geknackt hat, dann sieht er auch alle anderen. Daher mit Hash-Wert arbeiten (auch mal Googlen). Also:
PHP:
$passwort = md5($passwort);

Die Daten zu prüfen kann man SQL größtenteils überlassen:
Code:
SELECT * FROM `kartenhauser` WHERE `username` = '$benutzername' && `passwort` = '$passwort'
Und dann in PHP nur noch gucken ob genau eine Zeile gefunden wurde:
PHP:
if (mysql_num_rows($result) == 1)
{
  // alles ok
} else {
  // Benutzername oder Passwort falsch
}
Gib immer aus das eins von beiden Falsch ist, aber sage nicht explizit dass das Passwort falsch ist. Das ist fast eine Sicherheitslücke die geschlossen wird, da der "Angreifer" es schwerer hat. Er könnte ein Bot durchlaufen lassen der unzählig viele Anmeldenamen prüft und wenn er sieht das nur das Passwort falsch ist dann hat er einen Ansatz und brauch sich nur noch um das PW kümmern. Gibt man aus das eins von beiden Falsch ist, weis kein dritter was von beiden falsch ist und so quadrierst du die Sicherheit fast schon - wenns dafür eine Zahl gäbe ;)
 
Hi Zod,
vielen Dank. Funktioniert dank Deiner Hilfe. Dann werd ich mich mal ans weiterprogrammieren machen, das fängt langsam an richtig spaß zu machen *freu*. Nochmals vielen Dank und ein schönes Wochenende.

Gruß
Wolfi
 
Zurück