Benutzeranmeldung mit Namen und Passwort
Andreas Bockhold
- php
0 Heiner0 fastix®0 denito0 Joachim0 Christian Bernhard
Hallo,
ich bin dabei mir eine Benutzeranmeldung mit PHP und Datei als "Benutzerdatenbank" zu bauen. Leider funktioniert das Script nicht ganz so wie ich möchte:
<?php
// Datei mit Benutzernamen und Kennwörtern, wie: benutzer=kennwort
$userdb_file = file ('sec/passwd.txt');
// Grundeinstellung ob Benutzer bekannt: nein
$knownuser = "false";
// Wurde vorgeschaltetes Formular ausgefüllt?
if ( isset($name) && isset($passwort) && $name != "" && $passwort != "" )
{
// ja: Extrahiere aus den Zeilen der Datei Benutzernamen und Kennwort
foreach ($userdb_file as $user_num => $user_string)
{
// $user_string wird in Name $userdb_array[0] und Passwort $userdb_array[1] aufgeteilt
$userdb_array = explode ("=",$user_string);
// Wenn eingegebener Name $name und Passwort $passwort mit einem Paar aus der Datei übereinstimmt,
// setze Einstellung, dass Benutzer bekannt
if ( $name == $userdb_array[0] && $passwort == $userdb_array[1] )
{
$knownuser = "true";
}
}
}
else
{
//nein: Meldung ausgeben
echo "Nicht angemeldet.";
}
if ($knownuser == "true")
{
echo "Validierter User";
}
else
{
echo "Nicht angemeldet!";
}
?>
Die Passwortdatei sieht folgendermaßen aus:
benutzer1=passwort1
benutzer2=passwort2
benutzer3=passwort3
Mein Problem ist, dass man sich immer nur als der Benutzer, der als letztes in der Passwortdatei genannt wird, anmelden kann (in meinem Beispiel also als "benutzer3"). Woran liegt das und wie muss ich das foreach-Konstrukt abwandeln, dass es mit allen Benutzern geht?
Vielen Dank,
Andreas
Hallo,
Warum machst Du es nicht mit htaccess?
Heiner
Hi,
Warum machst Du es nicht mit htaccess?
ich möchte in einer Seite einen für alle lesbaren Teil und einen, der erst nach Anmeldung in dieser Seite zu sehen ist, haben. Mit .htaccess kann ich aber nur ganze Seiten schützen...
MfG
Andreas
Moin!
Erster gefundener möglicher Fehler:
if ( isset($_POST['name']) && isset($_POST['passwort']) && $_POST['name'] != "" && $_POST['passwort'] != "" )
Aktuelle Sicherheitseinstellungen aktueller PHP- Versionen verhindern eine globale und ungefragte Übernahme von Formulardaten in Variablen.
Zweiter gefundener möglicher Fehler:
Wo liest Du Deine Daten aus dem userdb_file ein?
Da müsste was fopen, fget und so weiter zu finden sein.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hi,
Zweiter gefundener möglicher Fehler:
Wo liest Du Deine Daten aus dem userdb_file ein?
Da müsste was fopen, fget und so weiter zu finden sein.
oberste zeile im script:
$userdb_file = file ('sec/passwd.txt');
gruss,
wahsaga
Danke für deine Antwort!
[...]
Aktuelle Sicherheitseinstellungen aktueller PHP- Versionen
verhindern eine globale und ungefragte Übernahme von Formulardaten
in Variablen.
Hm, ich kann die Variablen aber per
echo $name;
ausgeben... Daran dürfte es als eigentlich nicht liegen.
Wo liest Du Deine Daten aus dem userdb_file ein?
Da müsste was fopen, fget und so weiter zu finden sein.
In der vierten Zeile:
// Datei mit Benutzernamen und Kennwörtern, wie: benutzer=kennwort
$userdb_file = file ('sec/passwd.txt');
Darüber steht eigentlich die Datei unter $userdb_file zur Verfügung.
MfG
Andreas
Deine foreach-Schleife wird grundsätzlich dreimal durchlaufen (da drei Einträge in der Passwortdatei). Und nach den Durchläufen bleibt immer die letzte Zeile (also benutzer3) gespeichert.
Du musst irgendwo in dieser Schleife ein "break" einführen, damit die Schleife abgebrochen wird, sobald eine Eingabe mit einem Eintrag in der Passwortdatei übereinstimmen.
Hallo,
Deine foreach-Schleife wird grundsätzlich dreimal durchlaufen (da
drei Einträge in der Passwortdatei). Und nach den Durchläufen
bleibt immer die letzte Zeile (also benutzer3) gespeichert.
Das müsste aber doch eigentlich egal sein, da doch die Information, ob der Benutzer berechtigt ist, unabhängig von dessen Namen in der Variablen $knownuser gespeichert wird:
$knownuser = "true";
Du musst irgendwo in dieser Schleife ein "break" einführen, damit
die Schleife abgebrochen wird, sobald eine Eingabe mit einem
Eintrag in der Passwortdatei übereinstimmen.
Auf die Idee war ich auch schon mal gekommen, da ich aber noch Anfänger bin, stellt sich mir die Frage wo genau ich das einfügen muss. In der if-Bedingung funktioniert es nämlich nicht...
MfG
Andreas
Hi,
$userdb_file = file ('sec/passwd.txt');
Vorsicht: so kann die Datei von jedem aufgerufen werden!
if ( $name == $userdb_array[0] && $passwort == $userdb_array[1] )
moeglicherweise stecken da Leerzeichen drinne, daher scheitert ein Vergleich. Versuch mal trim().
Btw: Generell wuerde ich sowas eher mit einer Session loesen.
hth + Gruesse Joachim
Hallo,
$userdb_file = file ('sec/passwd.txt');
Vorsicht: so kann die Datei von jedem aufgerufen werden!
naja, zum einen werden (wenn ich das bestehnde Problem gelöst habe) alle Benutzernamen und Passwörter verschlüsselt gespeichert werden, zum anderen liegt diese Datei in einem Verzeichnis, in dessen .htaccess-Datei "Deny from all" steht.
if ( $name == $userdb_array[0] && $passwort == $userdb_array[1] )
moeglicherweise stecken da Leerzeichen drinne, daher scheitert ein Vergleich. Versuch mal trim().
Danke für den Hinweis, das könnte vielleicht später Probleme verursachen, zur Zeit muss das Problem aber anderwo liegen, da ich die im Ursprungsposting angegebene Benutzer/Kennwortdatei zum Testen verwende. Und in den Namen/Kennwörtern der Datei gibt es wie du sehen kannst keine Leerzeichen.
Btw: Generell wuerde ich sowas eher mit einer Session loesen.
Hm, ich bin Programmier und PHP-Anfänger, deshalb habe ich derzeit leider überhaupt keine Ahnung von Sessions...
MfG
Andreas
Hi,
Danke für den Hinweis, das könnte vielleicht später Probleme verursachen, zur Zeit muss das Problem aber anderwo liegen,
sicher? Wenn ich Dein (abgewandeltes) Script so aufrufe geht es:
<?php
$userdb_file[] = "bla=bluh";
$userdb_file[] = "foo=bar";
$userdb_file[] = "xxx=yyy";
$knownuser = false;
if (isset($_GET["name"]) && isset($_GET["passwort"]) && $_GET["name"] && $_GET["passwort"]) {
foreach ($userdb_file as $user_num => $user_string) {
$userdb_array = explode ("=",$user_string);
if ($name == $userdb_array[0] && $passwort == $userdb_array[1] ) {
$knownuser = true;
}
}
} else {
echo "Nicht angemeldet.";
}
echo $knownuser? "Validierter User" : "Nicht angemeldet!";
?>
BTW: true und false sind boolsche Werte und _keine_ Strings!
Gruesse Joachim
Hallo,
es ist zum Heulen, wenn ich dein Script aufrufe, geht es auch bei mir.
Nehme ich dann allerdings wieder meine Datei als Datenquelle anstatt deines direkt definierten Arrays geht es nicht mehr ... bzw. es kann sich wieder nur noch der letzte Benutzer anmelden (in diesem Falle jetzt "xxx" mit "yyy" als Kennwort).
Auch das das Einfügen der Zeile
foreach ($userdb_file as $key=>$value) { $db[$key]=trim($value); }
hat daran nichts verändert (wobei tatsächlich der Zeilenumbruch hinter jedem Wertepaar evtl. eine Fehlerquelle sein könnte?).
BTW: true und false sind boolsche Werte und _keine_ Strings!
Ups, stimmt, da müssen die Gänsefüßchen weg...
Hast du vielleicht noch eine zündende Idee?
Ich bin leider irgendie am Ende mit meinem Latein.
MfG
Andreas
PS: Oder könntest du mir einen Tip geben, wie ich das mit Sessions lösen könnte? Wenn gar nichts anderes hilft...
Hallo erstmal...
Guck doch auf http://www.php4-forum.de
Dort findest Du ein Beispiel-Login-Script, das
Deine User aus der DB ausliest... Wesentlich
praktikabler, zumal sich jetzt auch User registrieren
könnten...
Viele Grüße
Chris