PHP Kleine Frage zu Benutzer-Login

eightcore

Lt. Commander
🎅Rätsel-Elite ’25
Registriert
Juli 2008
Beiträge
1.698
Guten Abend!
PHP:
<?php
$enteredUsername = $_POST['username'];
$enteredPassword = $_POST['password'];
$loginSuccess = false;
$users = fopen("users.txt","r");

while (!feof($users)) {
    $line = fgets($users,27);
    $correctCredentials = explode("$", $line , 20);
	if ($enteredUsername == $correctCredentials[0]) {
		if ($enteredPassword == $correctCredentials[1]) {
			$loginSuccess = true;
			break;
		}
	}
}
 
if ($loginSuccess == true) {
	echo "Angemeldet.";
}
else {
echo "Benutzer nicht gefunden.";
}
?>
 </body>
</html>

Die Datei users.txt ist so aufgebaut:
Code:
eightcore$123456
hans$234567


Das Problem:
Nur bei dem Benutzer, der sich zuhinterst in der Datei users.txt befindet, klappt die Anmeldung. Also die Schleife erfüllt ihren Zweck nur beim letzten Durchlauf.

Kann mir jemand helfen? Ist ganz sicher nur ein kleiner Denkfehler.
 
Könnte es vielleicht am Zeilenumbruch liegen?
Also dem \n bzw \r\n am Ende der Zeile?
 
Welchen Sinn hat der Parameter length bei fgets?
Eine gute Idee, wenn man nicht weiter kommt, ist immer sich den Inhalt der Variablen bei den einzelnen Schritten anzuzeigen.
Also einfach hinter "$line = fgets($users,27);" ein "echo $line;" und wenn das stimmt, dann gibst du "$correctCredentials" aus usw.
 
Mal so aus dem Bauch heraus gesagt, würde ich die beiden Variablen in den IF - Klauseln vertauschen...

EDIT:

Versuche mal
Code:
if ($correctCredentials[0]==$username and $enteredPassword==trim($correctCredentials[1]))

Anstatt:
Code:
	if ($enteredUsername == $correctCredentials[0]) {
if ($enteredPassword == $correctCredentials[1]) {
$loginSuccess = true;
break;
}
}
}
 
Zuletzt bearbeitet:
toxn und stupidus, ihr hattet Recht.

Mit
Code:
    $line = trim(fgets($users,27));
funktioniert's einwandfrei. Vielen Dank!
 
Kleiner Kommentar am Rande: was wenn das User Password ein $ Zeichen enthält?

Code:
luky37$123$bzrlhoropirg$oingrirng

Dann wird bei deinem Code nur 123 als Passwort überprüft. Wenn du das schon so unescaped und ungehast stehen lässt (was eine zeimlich schlechte Idee ist), dann mache wenigstens aus dem limit Parameter der explode Funktion ein 2 statt eine 20.

Dann musst du natürlich beim Schreiben der Passwörter noch die Newlines escapen (wie du das machen willst weiß ich nicht). Das alles wäre nicht nötig, wenn du einen hash benutzen würdest.

Standard hashes wie md5 und sha1 sind dann natürlich wiederum anfällig gegen Rainbox Tables. Deshalb wäre eine ordentliche Library, die dir diese ganzen Feinheiten abnimmt, sehr zu empfehlen.


Beispiel: die password_compat Library, die ab PHP 5.3.7 Vorwärtskompatibilität zu den password_* Funktionen für PHP 5.5 anbietet; diese sind wirklich sehr einfach zu benutzen.

Einfach die password.php downloaden, requiren und die 2 simplen Funktionen benutzten:

PHP:
<?php
require('password.php');
// Passwort hashen
$hash = password_hash($password, PASSWORD_DEFAULT);

// Passwort verifizieren
if (password_verify($password, $hash)) {
    /* Valid */
} else {
    /* Invalid */
}

Bei deinem Code musst nämlich wirklich an alle möglichen Sicherheitslücken denken beim Schreiben und beim Interpretieren der Passwörter aus und in die users.txt Datei.
 
Das Passwort kann nur Zahlen enthalten. Das ist eine Arbeit für die Schule. Der Auftrag ist klar definiert; wenn steht, dass es verschlüsselt sein muss, verschlüssle ich es, wenn es nicht steht, mache ich nichts. Ich stehe unter Zeitdruck und mache möglichst genau das, was gefordert wird und nicht mehr.
 
Zurück
Oben