PHP Passwort-Vergleich geht nicht (Programmieren)

PHP Passwort-Vergleich geht nicht (Programmieren)

Hallo!

Ich hab ein kleines Problem in Sachen PHP/MySQL bei einer Login-Seite.
Theoretisch würde das ganze wie folgt ablaufen:
1. Username aus Eingabefeld wird in Variable gespeichert.
2. Passworteingabe wird per MD5 verschlüsselt.
3. In der Datenbank wird nach dem Usernamen gesucht.
4. Dazugehöriges (verschlüsseltes) Passwort wird in Variable gespeichert.
5. Passwort aus Datenbank und Eingabe des Users werden verglichen; falls die Werte übereinstimmen, wird der User eben angemeldet.

Der Ablauf ist also eigentlich totsicher und auch im Quelltext habe ich keinen Fehler gefunden. Als ich das Passwort testweise im Quelltext gespeichert hatte, ging es auch noch, aber nun scheint sich irgendwo ein Fehler eingeschlichen zu haben.

Der Quelltext lautet wie folgt (nur der relevante Auszug):

if ($_REQUEST['send']) {
include("../dbconnect.php");

$name = $_POST['name'];
$password = md5($_POST['password']);

$query = "SELECT
Passwort
FROM
user
WHERE
Name = '$name'";
$result = mysql_query($query) or DIE("Daten konnten nicht übertragen werden.");
$row = mysql_fetch_assoc($result);

if ($password == $row['Passwort']) {
session_start();
$_SESSION['angemeldet'] = true;

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/cp.php');
}
}


Daran, dass die Werte doch nicht übereinstimmen, kann es auch nicht liegen, da ich während der Fehlersuche beide Werte (Usereingabe und Wert aus der DB) per echo ausgeben ließ und die Werte tatsächlich übereinstimmten.

Vielen Dank für jede Hilfe!
http://de.php.net/manual/en/function.strcmp.php

Strings nicht per "==" vergleichen.
Ich habe es mit der strcmp-Funktion versucht und das Problem besteht nach wie vor: Lasse ich das verschlüsselte Passwort aus der Datenbank abholen, funktioniert der Login nicht; speichere ich das verschlüsselte Passwort im Quelltext, funktioniert alles tadellos.

Quellcode mit strcmp:

if ($_REQUEST['send']) {
include("../dbconnect.php");

$name = $_POST['name'];
$password = md5($_POST['password']);

$query = "SELECT
Passwort
FROM
user
WHERE
Name = '$name'";
$result = mysql_query($query) or DIE("Daten konnten nicht übertragen werden.");

$row = mysql_fetch_assoc($result);
$pw = $row['Passwort'];
$vergleich = strcmp($password,$pw);

if ($vergleich == 0) {
session_start();
$_SESSION['angemeldet'] = true;

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/cp.php');
}
}


Edit:
Übrigens kann ich mich ja auch einloggen, wenn ich das verschlüsselte PW im Quelltext speichere, die Strings aber trotzdem per "==" vergleiche. Das Problem liegt also anscheinend beim Abholen aus der Datenbank, wo der MD5-Wert als Text gespeichert wird.

Edit 2:
Allerdings wird das verschlüsselte PW tatsächlich aus der Datenbank abgeholt. Der Fehler kann also auch nicht in der Verbindung zur Datenbank liegen.

Edit 3:
Lasse ich per echo den Wert $vergleich ausgeben, kommt -1 heraus, also scheinen sich die zwei Strings tatsächlich zu unterscheiden, obwohl sie scheinbar gleich sein.
OK, hat sich erledigt. ^^ In dem Datenbankeintrag war am Ende der Zeichenkette noch ein Leerzeichen; ist also logisch, dass es nicht ging.
Außerdem vielen Dank an UKA für den Hinweis!

Der Thread kann geschlossen werden.
session_start();

solltest du besser immer als ersten Befehl eines PHP Scripts in Zeile 1 starten.

Kannst dann nach der If-Abfrage die Variable setzen.
Danke, aber welchen Vorteil würde das bringen?
ähm ... du solltest deine Abfrage an sich sicherer gestalten und performanter.
Teste, ob ein Eintrag mit dem Nutzernamen und dazugehörigen Passwort existiert. Das geht schneller und erspart dir einige Zeilen in php :)
Mittlerweile sieht der Code auch so aus, wie Du es beschreibst.
Das hier war sozusagen erst "Version 0.1". ;)
Logge dich ein um einen Beitrag zu schreiben.