Passwortabfrage funktioniert nicht (Endlosschleife?)
Maike
- php
Hallo Jungs und Mädels,
meine Passwortabfrage funktioniert leider nicht. Ich glaube irgendwie klappt das einlesen der Passwort/user kombination aus der passwd.txt nicht. Sie liegt im selben Verzeichnis. Sehr ihr einen Fehler?
----Inhalt-passwd.txt----
admin|admin
test|test
----Inhalt-passwd.php----
<form method="post" action="passwd.php">
<input type="text" name="user" value="user">
<input type="text" name="passw" value="password">
<input type="submit" value=" SEND ">
</form>
<?php
if ($_POST['user'] != "")
{
$fd = fopen(passwd.txt, 'r');
$i = 0;
while(!$fd) // solange, wie Dateiende nicht erreicht
{
//Zeilenweise einlesen
$userundpass = file(passwd.txt);
// einzelne Zeile auseinandernehmen
$ex = explode('|', $userundpass[$i]);
$benutzer[$i] = $ex[0];
$passwort[$i] = $ex[1];
$i++;
}
// Überprüfung, ob Formulardaten übereinstimmen
$j = $i;
for($i=0;$i<=$j;$i++)
{
if($_POST['user']==$benutzer[$i] && $_POST['passwd']==$passwort[$i])
echo 'Login erfolgreich!';
else
echo 'Falscher Benutzername oder Kennwort!';
}
fclose($fd);
}
?>
mfg Maike
Viel zu kompliziert.
erst die textdatei mit file(datei) auslesen,
dann das array nach "$user|$pwd" durchsuchen, wenn true, dann login.
gruß
y
Hallo Jungs und Mädels,
meine Passwortabfrage funktioniert leider nicht. Ich glaube irgendwie klappt das einlesen der Passwort/user kombination aus der passwd.txt nicht. Sie liegt im selben Verzeichnis. Sehr ihr einen »»
Ich hab gerade in meine Errorlog reingeschaut. So ne lange errorlog hab ich noch nie gesehen!
PHP Warning: file(passwdtxt): failed to open stream: No such file or directory in /web/fotos/detail_test.php on line 274
obwohl ich passwd.txt immer mit dem punkt zwischen passwd und txt geschrieben habe. Versteh ihr das?
Maike
der dateiname ist ein String, also:
file("pwd.txt");
oder
$datei = "pwd.txt";
file($datei);
s
Hallo,
$datei = "pwd.txt";
file($datei);
Danke, das wars.
Trotzdem funktioniert es einfach nicht
<form method="post" action="passwd.php">
<input type="text" name="user" value="user">
<input type="text" name="passw" value="password">
<input type="submit" value=" SEND ">
</form>
</p>
<?PHP
$file="passwd.txt";
$fd = fopen($file, 'r');
$i = 0;
while(!$fd) // solange, wie Dateiende nicht erreicht
{
//Zeilenweise einlesen
$userundpass = file($file);
// einzelne Zeile auseinandernehmen
$ex = explode('|', $userundpass[$i]);
$benutzer[$i] = $ex[0];
$passwort[$i] = $ex[1];
$i++;
}
// Überprüfung, ob Formulardaten übereinstimmen
$j = $i;
for($i=0;$i<=$j;$i++)
{
if($_GET['user']==$benutzer[$i] && $_GET['passwd']==$passwort[$i])
echo 'Login erfolgreich!';
else
echo 'Falscher Benutzername oder Kennwort!';
}
fclose($fd);
?>
Es gibt immer 'Login erfolgreich aus'.
Wo ist der Fehler?
mfg Maike
Huhu Maike
Trotzdem funktioniert es einfach nicht
POST != GET
while(!$fd) // solange, wie Dateiende nicht erreicht
{
//Zeilenweise einlesen
$userundpass = file($file);
// einzelne Zeile auseinandernehmen
$ex = explode('|', $userundpass[$i]);
$benutzer[$i] = $ex[0];
$passwort[$i] = $ex[1];
$i++;
}
diese while-Schleife ist in Kombination mit file nicht sinnvoll, da
die Funktion file bereits die komplette Datei einliest.
(Schau mal im Manual nach was file tut)
Hier ensteht sogar eine Endlos-Schleife (sobald $fd wahr ist).
Dann müssen vor dem Stringvergelich noch die Newlinezeichen entfernt werden. (z.B. per trim)
Viele Grüße
lulu
Huhu Maike
obwohl ich passwd.txt immer mit dem punkt zwischen passwd und txt geschrieben habe. Versteh ihr das?
Ja.
Setze den Level für Dein error-reporting hoch.
Z.B. am Anfang Deines Skriptes mit
ini_set('error_level', E_ALL);
dann wird Dir die Ursache dieses Fehlers mitgeteilt ;-)
Viele Grüße
lulu
Huhu again
ini_set('error_level', E_ALL);
ist natürlich so falsch,es muss richtig heissen
ini_set ('error_reporting', E_ALL);
sorry und viele Grüße
lulu
Hello,
für das Wegschreiben und Holen von Datenstrukturen bietet PHP die Funktionen serialize() und unserialze(). Damit kann man bestens _ein_ grosses Array "verpacken" und in einer Datei speichern.
schreiben mit fwrite(),
lesen mit fread($fh,filesize($dateiname));
nicht mit fgets() oder ähnlich, da auch das Array \n enthalten kann und würden dann zu Fehlern führen.
Wenn mehr als ein Array wegspeichern will, muss man die einzelnen Arrays entweder wieder in einem großen binden, oder aber die Newlines vorher ersetzen. Das ist speziell bei binären Werten nicht einfach möglich.
Grüße
Tom
Hallo Tom,
für das Wegschreiben und Holen von Datenstrukturen bietet PHP die Funktionen serialize() und unserialze(). Damit kann man bestens _ein_ grosses Array "verpacken" und in einer Datei speichern.
schreiben mit fwrite(),
lesen mit fread($fh,filesize($dateiname));nicht mit fgets() oder ähnlich, da auch das Array \n enthalten kann und würden dann zu Fehlern führen.
Wenn mehr als ein Array wegspeichern will, muss man die einzelnen Arrays entweder wieder in einem großen binden, oder aber die Newlines vorher ersetzen. Das ist speziell bei binären Werten nicht einfach möglich.
Ich verstehe das nicht so richtig.
Wärst du so lieb, mir das am konkreten Beispiel zu erklären?
mfg Maike
Hello Maike,
gegeben ist ein array:
$ini_data = array();
$ini_data["password"] = "xyZ08/16k1e8ung";
$ini_data["username"] = "Hans Wurst";
$ini_data["last_log"] = date("d.m.Y H:i:s");
Diese Daten wollen wir nun in einer Datei sichern, damit sie für dieses und andere Scripte fortan nutzbar sind:
$dateiname = "inidata.dat.php";
$fh = fopen($dateiname,"w"); .
$file_data = serialize($ini_data);
fwrite($fh, $file_data);
fclose($fh);
Nun haben wir ein weiteres Script, dass nur ausgeführt werden darf, wenn per Post das richtige Passwort und der richtige Username übermittelt wurden:
...
$pass = "";
if (isset($_POST["pass"])
{
$pass = trim($_POST["pass"]);
}
$user = "";
if (isset($_POST["user"])
{
$user = trim($_POST["user"]);
}
$file_data = file_get_contents("inidata.dat.php");
$ini_data= unserialize($file_data);
if (($ini_data["password"] != $pass)
or ($ini_data["username"] != $user))
{
echo "Sie haben keinen Zugang!<br />";
exit;
}
echo "Herzlich Willkommen $user. Ihr letzter Login war ".
"$ini_data["last_log"]."<br />";
$ini_data["last_log"] = date("d.m.Y H:i:s");
$dateiname = "inidata.dat.php";
$fh = fopen($dateiname,"w"); .
$file_data = serialize($ini_data);
fwrite($fh, $file_data);
Nun hoffe ich, dass Die das als Beispiel für Serialize(), unserialize(), file_get_contents(), usw reicht.
Liebe Grüße
Tom
#... Rest vom Script...
Hello Maike,
in diesem Skript steckt noch ein gefährlicher Fehler:
...
$pass = "";
if (isset($_POST["pass"])
{
$pass = trim($_POST["pass"]);
}$user = "";
if (isset($_POST["user"])
{
$user = trim($_POST["user"]);
}inidaten lesen
$file_data = file_get_contents("inidata.dat.php");
if (strlen($file_data) < 10) die("Passwortdatei nicht lesbar");
inidaten wieder in Array zurückverwandeln.
$ini_data= unserialize($file_data);
Grüße
Tom
Hallo Maike,
Hallo Jungs und Mädels,
meine Passwortabfrage funktioniert leider nicht. Ich glaube irgendwie klappt das einlesen der Passwort/user kombination aus der passwd.txt nicht. Sie liegt im selben Verzeichnis. Sehr ihr einen Fehler?
Dir ist aber schon klar, dass Deine Passwortabfrage äußerst unsicher ist? Auf die Textdatei kann _jeder_ zugreifen. Und bei unverschlüsselten Passwörtern muss man kein Genie sein um zu verstehen wie man sie benutzt.
Gruß,
small-step